【问题标题】:Alternative of Object.assign(...array)Object.assign(...array) 的替代方案
【发布时间】:2016-12-23 11:04:50
【问题描述】:

假设我们有一个对象数组。

调用Object.assign(...array) 会在索引为i 的对象覆盖索引为i-1 的对象中的现有属性的对象之间进行继承

例如:

var array=[{interf:'IPerson',name:'Someone'},{clss:'Person',name:'Ahmed'},{student:true}];
console.log(
    Object.assign(...array) // Object.assign(array[0],array[1],array[2])
)

现在,使用 Babel 和建议的对象扩展语法,我们可以静态地做到这一点:

{...array[0],...array[1],...array[2]} // spread used for each object not for array

如何动态地做到这一点?

“扩展语法”的上下文有重叠。我的意思是如何对两者使用传播语法:

  • 让阵列散布元素。
  • 为输出字面量对象{}做继承

?

我尝试了{...array},它返回{0:<array[0]>,1:<array[1]>,2:<array[2]>},它Object.assign(...array) 的输出相同。

【问题讨论】:

  • ES7 完成并发布,对象传播不是其中的一部分。只说“提议的对象传播语法”,不要说 ES7。
  • 赋值与继承无关。使用术语“扩展”或“混合”。
  • @loganfsmyth:您认为我们应该为每个提案都贴上标签吗? (按需创建)
  • 强硬的,不知道有没有人会用,不过应该不错
  • 有人可以用 sn-p 提出一个替代方案吗?

标签: javascript babeljs ecmascript-next


【解决方案1】:

你正在寻找

var obj = Object.assign({}, ...array)

创建一个新对象而不是改变array[0]

【讨论】:

  • 你会碰巧有一个 IE11 安全的替代 .assign() 吗?因为this,现在正在寻找它(请参阅要求)
  • 不,你可以安全地在 IE11 中使用Object.assign,只需polyfill it
【解决方案2】:

在我看来您正在寻找的方法是 .concat()

返回一个新数组,它是目标和源的合并。

【讨论】:

    【解决方案3】:

    用数组对象分配对象:

    var a = {
      'name': 'Ajay'
    }
    
    var b = {
      approvers: [{
        id: '12'
      }]
    }
    
    var c = Object.assign(a, b);
    console.log(c);

    【讨论】:

      【解决方案4】:

      如上所述,我认为您正在寻找的方法是 .concat(),它创建一个数组的副本并用另一个数组扩展它。

      var a1 = [1,2,3], a2 = [];
      
      a2 = a2.concat(a1);
      
      // or ES5 shorten alternative 
      // var a1 = [1,2,3], a2 = [].concat(a1);
      
      // or better ES6 shorten alternative 
      // a2 = [...a1];
      
      a2.push(4);
      
      console.log(a1, a2);
      
      // a1 -> [1,2,3], a2 -> [1,2,3,4]
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-06-01
        • 2015-06-13
        • 2015-03-03
        • 2015-09-25
        相关资源
        最近更新 更多