检查 ID 是否在 ES6 中找到另一个数组

Check if ID Is Found Another Array in ES6

我想过滤掉数据。我想检查 data1 上的数据是否在 data2 上找到,并检查它是否有错误消息。请在下面检查我的代码。有更好的方法吗?

data1

[
    {
        "ids": "0111",  
    },
    {
        "ids": "0222",
    },
    {
         "ids": "0333",
    }
]

data2

[
  {
    "id": "0111",
    "errorMessages": [
      {
        "message": ["sample error message 1"]
      }
    ]
  },
  {
    "id": "0333",
    "errorMessages": []
  }
]

代码

const output= data1.filter(
  (element) => element.ids === data2.find((data) => data).id
);

console.log("output", output);

.find((data) => data) 没有做任何有用的事情 - 数组中的每个项目都是一个对象,这是真实的,所以它总是 return 数组中的第一个元素。

如果您 did 想要 .find 另一个数组中的匹配元素 - 那么更好的方法是制作一组在另一个数组中找到的 ID数组优先(设置查找比 .find 快得多 - O(1),即 O(n))。

您还需要实现检查 errorMessages 是否为空的逻辑。

const data1 = [
    {
        "ids": "0111",  
    },
    {
        "ids": "0222",
    },
    {
         "ids": "0333",
    }
]
const data2 = [
  {
    "id": "0111",
    "errorMessages": [
      {
        "message": ["sample error message 1"]
      }
    ]
  },
  {
    "id": "0333",
    "errorMessages": []
  }
]


const ids = new Set(
  data2
    .filter(item => item?.errorMessages.length)
    .map(item => item.id)
);

const output= data1.filter(
  element => ids.has(element.ids)
);
console.log("output", output);

没有设置,但使用对象作为地图。


const IDKeys = {};

data2.forEach(data => {
    if (data.errorMessages.length){
       IDKeys[data.id] = true; // means valid 
    }
})


const filteredArray = data1.filter(data => IDKeys[data.id]);

这只会是 O(n),因为访问对象上的键是 O(1)