检查每个id是否在数组

时间:2018-06-07 14:16:49

标签: javascript ecmascript-6

我想检查数组的每个id是否存在现有对象。

const ids = [ 'xxnQt5X8pfbcJMn6i', 'fbcJMn6ixxnQt5X8p' ]
const target = [
  { _id: 'xxnQt5X8pfbcJMn6i' },
  { _id: 'Qt5X8pfbcJMn6ixxn' },
]

在这个例子中,我想获得false,因为第二个ID(fbcJMn6ixxnQt5X8p)不存在。

这应该返回true

const ids = [ 'xxnQt5X8pfbcJMn6i', 'fbcJMn6ixxnQt5X8p' ]
const target = [
  { _id: 'xxnQt5X8pfbcJMn6i' },
  { _id: 'Qt5X8pfbcJMn6ixxn' },
  { _id: 'fbcJMn6ixxnQt5X8p' },
]

这是我尝试过的:

ids.every(id => target.find(element => element._id === id))

3 个答案:

答案 0 :(得分:1)

你非常接近,你需要将一个函数而不是一个对象传递给find - 如果你只是想要我推荐使用some()而不是find知道它是否存在,而不是你需要对象作为回报。

const ids = [ 'xxnQt5X8pfbcJMn6i', 'fbcJMn6ixxnQt5X8p' ]
const target = [
  { _id: 'xxnQt5X8pfbcJMn6i' },
  { _id: 'Qt5X8pfbcJMn6ixxn' },
  { _id: 'fbcJMn6ixxnQt5X8p' },
]

const allIn = ids.every(id => target.some(({_id}) => id === _id));
console.log(allIn);

答案 1 :(得分:1)

使用大量条目时,使用Set可能会更快(因此我们得到O(n + m)而不是O(n * m)):

const idSet = new Set(target.map(el => el._id));
const result = ids.every(id => idSet.has(id));

答案 2 :(得分:0)

由于每个人本身都是一个检查方法,因此它通过提供的函数返回truefalse。因此,您只需返回false

即可

const res = const res = ids.every(id => target._id === id); console.log(res);

true

const res = ids.every(id => target._id !== id); console.log(res);