javascript - 如何在数组项的第二个对象中查找第一个数组项并从第二个对象返回匹配项
问题描述
如何使用 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;
};
解决方案
您可以使用 ( ) 过滤.data
以通过数组 ( Array#filter
) 生成基于成员资格 ( Array#some
)的对象.labels
数组Array#includes
,然后重新构建您想要的结果对象或将过滤后的数组重新附加到.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
数组设为 a并降低成本。Set
推荐阅读
- ajax - 带有 Mapbox 的本地 GeoJSON 文件
- r - 编辑 DataTable 但当我们移动到另一个页面时更改消失
- tensorflow - Keras Scratch Graph 错误 - 为什么会发生此错误?
- firebase - 谷歌表格文档的状态变化可以触发云功能吗?
- c++ - 如何在 Opengl 中可视化聚光灯?
- python - 在带有标题的python中将文本解析为csv-F5 LTM
- animation - 转换框的问题:填充框和火狐
- symfony4 - 如何将 Date JsonObject 转换为字符串?
- bash - 传递用逗号分隔的bash数组
- networking - 如何找到较低层使用的协议?