假设我有一个包含一些对象的数组:
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);