基于另一个对象数组的Javascript过滤器数组

时间:2020-07-16 19:15:48

标签: javascript arrays sorting

我正在尝试基于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
}];

有什么建议吗?

2 个答案:

答案 0 :(得分:3)

您可以将Array#mapArray#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; }