[英]How to find first array items in second object of array items and return matched items from second object
如何在数组项的第二个对象中查找第一个数组项并使用 JavaScript 从第二个对象返回匹配的项。
第一个数组:
const firstArr = ["foo", "bar"];
第二个对象:
const secondObj = {
"items": [{
"name": "First item",
"labels":["foo"]
},
{
"name": "Second item",
"labels":["foo", "bar"]
},
{
"name": "Third item",
"labels":["baz"]
}]
}
预期的:
{
"items": [{
"name": "First item",
"labels":["foo"]
},
{
"name": "Second item",
"labels":["foo", "bar"]
}]
}
我尝试了以下内容;
function updatedVersion() {
var thirdArr = [];
for (var array of firstArr) {
if (secondObj) {
for (var obj of secondObj.items) {
for (var label of obj.labels) {
if (array === label) {
thirdArr.push(obj);
}
}
}
}
}
return thirdArr;
};
您可以使用( Array#filter
)过滤.data
以通过.labels
数组( Array#includes
)根据成员资格( Array#some
)生成.labels
数组,然后重新构建您想要的结果对象或重新附加过滤后的数组到.items
:
const firstArr = ["foo", "bar"]; const secondObj = { "items": [{ "name": "First item", "labels":["foo"] }, { "name": "Second item", "labels":["foo", "bar"] }, { "name": "Third item", "labels":["baz"] }] }; secondObj.items = secondObj.items.filter(({labels}) => labels.some(e => firstArr.includes(e)) ); console.log(secondObj);
请注意,为了复杂性,我们多次遍历firstArr
O(data.length * firstArr.length * max(data[_].labels.length))
O(firstArr.length + data.length * max(data[_].labels.length))
假设在集合上进行恒定时间查找。 如果您的结构很小,这是过早的优化,并且Set
分配的成本会增加开销。
同样,如果对您的应用程序有意义,您可以将每个labels
数组Set
一个Set
并在那里削减成本。
const firstArr = ["foo", "bar"]; const secondObj = { "items": [{ "name": "First item", "labels":["foo"] }, { "name": "Second item", "labels":["foo", "bar"] }, { "name": "Third item", "labels":["baz"] }] }; const filtered = {"items": secondObj["items"].filter(item=>item.labels.filter(val =>firstArr.includes(val)).length)} console.log(filtered)
编辑:正如@ggorlen
所说,对于每个搜索项,使用Array#some
比使用Array#includes
更有效。
const firstArr = ['foo', 'bar']; const secondObj = { items: [ { name: 'First item', labels: ['foo'], }, { name: 'Second item', labels: ['foo', 'bar'], }, { name: 'Third item', labels: ['baz'], }, ], }; const filter = (o, arr) => ({ items: o.items.filter((item) => item.labels.some((label) => firstArr.indexOf(label) + 1) ), }); console.log(filter(secondObj, firstArr));
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.