输入:
const parentArray = [
{id:1, name:'foo'},
{id:2, name:'bar'},
{id:4, name:'foobar'},
{id:6, name:'barfoo'}
]
const childArray = [
{parent_id:1, prop:'prop1'},
{parent_id:2, prop:'prop2'},
{parent_id:3, prop:'prop3'},
{parent_id:4, prop:'prop4'},
{parent_id:5, prop:'prop5'}
];
输出:
const resultingArray = [
{id:1, name:'foo'},
{id:2, name:'bar'},
{id:4, name:'foobar'}
]
我想比较两个数组的属性id
和parent_id
,并为匹配的属性返回parentArray
的子集
我尝试使用lodash过滤掉它们,但没有成功
答案 0 :(得分:3)
您可以将Set
用作通缉的父母,并过滤parent
数组。
var parents = [{ id: 1, name: 'foo' }, { id: 2, name: 'bar' }],
children = [{ parent_id: 1, prop: 'prop1' }, { parent_id: 3, prop: 'prop3' }],
wanted = new Set(children.map(({ parent_id }) => parent_id)),
result = parents.filter(({ id }) => wanted.has(id));
console.log(result);
答案 1 :(得分:2)
您可以通过以下方式结合使用Array.filter()
和Array.some()
。
const resultingArray = parentArray
.filter(x => childArray.some( y => y.parent_id===x.id));
答案 2 :(得分:1)
我们可以使用Set
作为子表中parent_id
数据的查找表,然后使用Array.prototype.filter
过滤父项并使用Set#has
进行检查如果ID包含在Set
中:
const parentArray = [{id:1, name:'foo'},{id:2, name:'bar'}, {id:4, name:'foo'},{id:6, name:'bar'}]
const childArray = [
{parent_id:1, prop:'prop1'},
{parent_id:2, prop:'prop2'},
{parent_id:3, prop:'prop3'},
{parent_id:4, prop:'prop4'},
{parent_id:5, prop:'prop5'}
];
function findSubSet(){
const lookup = new Set(childArray.map(({parent_id}) => parent_id));
return parentArray.filter(p => lookup.has(p.id));
}
console.log(findSubSet(parentArray, childArray));
答案 3 :(得分:0)
您可以使用reduce
和findIndex
。在reduce回调中使用findIndex
检查是否存在相同的ID。如果存在id
,它将返回index
;如果不存在,则返回-1
。因此,如果index不为-1,则可以将该值推送到accumulator(acc)
const parentArray = [{
id: 1,
name: 'foo'
}, {
id: 2,
name: 'bar'
}]
const childArray = [{
parent_id: 1,
prop: 'prop1'
},
{
parent_id: 2,
prop: 'prop2'
},
{
parent_id: 3,
prop: 'prop3'
}
]
let filteredData = parentArray.reduce(function(acc, curr) {
let getIndexFromChild = childArray.findIndex(function(item) {
return curr.id === item.parent_id
});
if (getIndexFromChild !== -1) {
acc.push(curr)
}
return acc;
}, []);
console.log(filteredData)
答案 4 :(得分:0)
如前所述,您的示例尚不清楚,但假设您要使用id
中的parentArray
和parent_id
中的childArray
属性,则使用另一个数组过滤一个数组,那么我将使用此:
resultingArray = childArray.filter(c=> parentArray.find(p => p.id === c.parentId);
答案 5 :(得分:0)