首页 > 解决方案 > 如何在数组项的第二个对象中查找第一个数组项并从第二个对象返回匹配项

问题描述

如何使用 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;
};

标签: javascriptarraysobject

解决方案


您可以使用 ( ) 过滤.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))

如果你制作needles一套使用.has你有

O(firstArr.length + data.length * max(data[_].labels.length))

假设在集合上进行恒定时间查找。如果您的结构很小,这是过早的优化,并且Set分配成本会增加开销。

同样,如果对您的应用程序有意义,您可以将每个labels数组设为 a并降低成本。Set


推荐阅读