我正在尝试基于Arr1
值合并两个数组。如果数组2在array1
中没有相应的值,则它应作为带有值的空对象返回。下面是两个数组:
Arr1 = [{
name: "raj",
age: 20
}, {
name: "ravi",
age: 40
}];
Arr2 = ['raj', 'ravi', 'arnold'];
JavaScript代码是
let result = Arr1.filter(o1 => Arr2.some(o2 => o2 === o1.name));
我得到的结果如下,
result = [{
name: "raj",
age: 20
}, {
name: "ravi",
age: 40
}];
但是期望的数组应该是
[{
name: "raj",
age: 20
}, {
name: "ravi",
age: 40
}, {
name: "arnold",
age: null,
available: no
}];
有什么建议吗?
答案 0 :(得分:3)
您可以将Array#map
与Array#find
一起使用以获得预期的结果。
let Arr1 = [{
name: "raj",
age: 20
}, {
name: "ravi",
age: 40
}];
let Arr2 = ['raj', 'ravi', 'arnold'];
let result = Arr2.map(x=>
Arr1.find(({name})=>name===x)??{name:x,age:null,available: 'no'}
);
console.log(result);
答案 1 :(得分:2)
我建议采用另一种方法,为给定数据获取一个对象,并映射所需名称以使给定数据或新对象成为可能。
这种方法具有更好的大O值,因为它需要一个哈希表并且可以快速处理大量数据。
const
array1 = [{ name: "raj", age: 20 }, { name: "ravi", age: 40 }],
array2 = ['raj', 'ravi', 'arnold'],
data = array1.reduce((r, o) => (r[o.name] = o, r), {}),
result = array2.map(name => data[name] || { name, age: null, available: 'no' });
console.log(result);
.as-console-wrapper { max-height: 100% !important; top: 0; }