如何有效地在另一个数组中查找一个数组的对象



假设我有一个包含一些对象的数组:

var objectsToFind = [
{
name: 'first',
value: 1,
},
{
name: 'second',
value: 2,
},
{
name: 'third',
value: 3,
}
];

我想得到这个数组的对象,这些对象与上一个数组的对象的name属性相匹配:

var findHere = [
{
name: 'fourth',
size: 36,
},
{
name: 'second',
size: 689,
},
{
name: 'third',
size: 47,
},
{
name: 'sixth',
size: 34,
},
];

所以结果是:

var result = [
{
name: 'second',
size: 689,
},
{
name: 'third',
size: 47,
},
];

我制作了一个使用foreach和find方法返回对象的方法,但我不知道这是否是最有效的方法。有更好的方法来实现这一点吗?

我的代码实现这一点:

var foundObjects = [];
objectsToFind.forEach(object => {
const found = findHere.find(element => element.name == object.name);
if (found != null) {
foundObjects.push(found);
}
});

将第一个数组中的键(在本例中为name值(放入Set中。过滤第二个,对于每个项目,检查其密钥是否在集合中:

function intersectBy(a, b, keyFn) {
let keys = new Set(a.map(keyFn));
return b.filter(x => keys.has(keyFn(x)));
}
result = intersectBy(objectsToFind, findHere, x => x.name)

代码片段:

var objectsToFind = [
{
name: "first",
value: 1
},
{
name: "second",
value: 2
},
{
name: "third",
value: 3
}
];
var findHere = [
{
name: "fourth",
size: 36
},
{
name: "second",
size: 689
},
{
name: "third",
size: 47
},
{
name: "sixth",
size: 34
}
];
function intersectBy(a, b, keyFn) {
let keys = new Set(a.map(keyFn));
return b.filter((x) => keys.has(keyFn(x)));
}
var result = intersectBy(objectsToFind, findHere, (x) => x.name);
console.log(result);

最新更新