【问题标题】:Object assign extend immutable array of object对象分配扩展对象的不可变数组
【发布时间】:2017-05-21 19:50:07
【问题描述】:

我想要一个不可变的原始对象数组并扩展一个新数组,但似乎下面的代码没有产生正确的结果。 obj3 变成了一个对象,而不是一个对象数组。我什至尝试过 lodash 的扩展。

var obj1 = [{
  abc: 'abc value'
}, {
  def: 'def value'
}];

var obj2 = {
  def: 'new def value'
};

/*var obj3 = _.extend({}, obj1, obj2);
console.log(obj3)
*/

var obj3 = Object.assign({},obj1,obj2);

https://jsbin.com/bawadeqicu/edit?html,js,output

我的愿望输出是

obj1: [{"abc":"abc value"},{"def":"def value"}] // immutable
obj3: [{"abc":"abc value"},{"def":"new def value"}]

【问题讨论】:

  • 克隆数组并将obj2 指定为新副本的第二个元素。没有“漂亮”的方法可以做到这一点。 var obj3 = obj1.slice(); obj3[1] = obj2;。我的意思是,你可以做var obj3 = Object.assign([], obj1, {1: obj2}); 但这似乎更神奇¯\_(ツ)_/¯
  • 为什么要更新第二个对象?因为它有一个属性def?您想根据属性匹配/合并对象吗?如果属性名称不同会怎样? obj2 会简单地添加到数组中吗?对象会合并到不同的地方吗?如果数组中的两个对象具有相同的属性怎么办?如果他们也有其他属性怎么办?您实际上并没有描述合并规则是什么,因此您得到的任何答案都只是基于您提供的特定输入和输出的解释。

标签: javascript arrays immutable.js


【解决方案1】:

您可以使用Object.entries().map() 散布元素在obj1 参数传递给Object.assign()obj1 数组的对象元素散布到新数组。

var obj1 = [{
  abc: 'abc value'
}, {
  def: 'def value'
}];

var obj2 = {
  def: 'new def value'
};

var obj3 = Object.entries(Object.assign({},...obj1, obj2))
           .map(([prop, value]) => ({[prop]:value}));

console.log(
  `obj1:${JSON.stringify(obj1)}`
  , `\nobj2:${JSON.stringify(obj2)}`
  , `\nobj3:${JSON.stringify(obj3)}`
)

【讨论】:

  • 这可能是正确的答案,您需要将键拆分为不同的对象,
  • 如果对象具有相同的属性名称,这将失败。
  • @FelixKling 你能描述一下你的意思吗?
  • 如果所有对象都具有属性abc,而不是def,那么您的代码将生成一个包含单个对象的数组。当然这可能是预期的结果,我不知道。
  • 困惑,我想我宁愿不要在这里做 inmmutable,只需将 push() 用于新的 var。
【解决方案2】:

不可变

与其传递对象并对其进行变异,不如创建一个全新的对象:

const person = {
  name: 'John',
  age: 28
}
const newPerson = Object.assign({}, person, {
  age: 30
})
console.log(newPerson === person) // false
console.log(person) // { name: 'John', age: 28 }
console.log(newPerson) // { name: 'John', age: 30 }

source

【讨论】:

  • 你应该详细说明这一点;仅链接的答案在此处不受欢迎,因为链接可能不会随着时间的流逝而存在。
  • @Jacob 你的意思是我应该写下答案并参考链接??
  • 我想要对象数组,而不仅仅是对象。
猜你喜欢
  • 1970-01-01
  • 2020-11-19
  • 2019-05-26
  • 1970-01-01
  • 2019-07-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多