将新属性添加到另一个数组的现有对象数组中

时间:2017-05-14 09:46:38

标签: javascript arrays reactjs ecmascript-6

我不知道如何正确地写出标题,请原谅我。

基本上我有一个来自某个地方的对象数组列表,我需要将它们映射到一起。如何使用我的代码,我无法做到。

const person = [
  {name:'hello',id:1},
  {name:'javascript',id:2},
  {name:'world',id:3}
];

const selected = [2,3];


const normalized = person.map((obj,i) => obj.id === selected[i] ? Object.assign({}, obj, {checked:true}) : obj);

console.log(normalized)

https://jsfiddle.net/q9g0kazx/1/

我需要在所选数组上添加额外的属性。为什么上面的代码不起作用?

2 个答案:

答案 0 :(得分:1)

如果我理解正确,只需使用forEach遍历数组,并在需要时添加属性。



const person = [
   {name: 'hello', id: 1},
   {name: 'javascript',id: 2},
   {name: 'world',id: 3}
];

const selected = [2,3];

person.forEach(p => {
  if (selected.includes(p.id)) {
    p.checked = true;
  }
});

console.log(person);




或者您可以像这样使用map



const person = [
   {name: 'hello', id: 1},
   {name: 'javascript',id: 2},
   {name: 'world',id: 3}
];

const selected = [2,3];

person.map(p => {
  if (selected.includes(p.id)) {
    p.checked = true;
  }
  return p;
});

console.log(person);




请注意,您必须return该对象(在我们的情况下为人)

答案 1 :(得分:0)

你可以这样做:

检查数组中的id是否出现在selected数组中:

selected.includes(obj.id)

因此,如果true数组中存在obj.id,则包括返回selected。如果存在(是),那么代码的Object.assign部分将执行。

您的代码无效的原因是因为您的person数组和selected数组不具有相同数量的元素(计数),也可能不在顺序中。 因此{1}} id为1并不与person[0] id匹配,其中2等等。



selected[0]