将新属性添加到另一个数组中的现有对象数组
Posted
技术标签:
【中文标题】将新属性添加到另一个数组中的现有对象数组【英文标题】:Add new property to existing array of object from another array 【发布时间】:2017-10-13 05:40:55 【问题描述】:我不知道如何正确地写标题,请原谅我。
基本上我有一个来自某个地方的对象数组列表,我需要将它们映射在一起。如何使用下面的代码我无法做到。
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/
我需要在所选数组的基础上添加一个额外的属性。为什么上面的代码不起作用?
【问题讨论】:
确切的预期结果是什么? 【参考方案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
对象(在我们的例子中是人)
【讨论】:
这里:developer.mozilla.org/en/docs/Web/JavaScript/Reference/…其实是,检查selected
中的索引是否和selected.indexOf(p.id) > -1
一样
一般我都会用indexOf,比较常见,用include比indexOf有什么好处?
我个人更喜欢返回我期望的类型的函数,例如布尔值。 indexOf
检查是否存在对我来说似乎是 hack。值得庆幸的是,es6 允许它。【参考方案2】:
你可以这样做:
检查数组中的id是否存在于selected
数组中:
selected.includes(obj.id)
因此,如果 obj.id
存在于 selected
数组中,则包含返回 true
。如果存在(是),那么您的 Object.assign
part 代码将执行。
您的代码不起作用的原因是因为您的 person
数组和 selected
数组没有相同数量的元素(计数),并且可能也不按顺序排列。
所以person[0]
id 为 1 与selected[0]
id 为 2 不匹配,依此类推。
const person = [
name: 'hello',
id: 1
,
name: 'javascript',
id: 2
,
name: 'world',
id: 3
];
const selected = [2, 3];
const normalized = person.map((obj, i) => selected.includes(obj.id) ? Object.assign(, obj,
checked: true
) : obj);
console.log(normalized);
【讨论】:
以上是关于将新属性添加到另一个数组中的现有对象数组的主要内容,如果未能解决你的问题,请参考以下文章
检查对象值是不是存在于 Javascript 对象数组中,如果不存在则将新对象添加到数组