如何根据 JavaScript 中的值检查对象是不是在数组中?

Posted

技术标签:

【中文标题】如何根据 JavaScript 中的值检查对象是不是在数组中?【英文标题】:How to check if objects are in an array based on a value in JavaScript?如何根据 JavaScript 中的值检查对象是否在数组中? 【发布时间】:2018-12-01 11:39:47 【问题描述】:

例如,如何根据id 来检查array2 中的所有对象是否存在于array1 中?

const array1 = [ id: 1 ,  id: 2 ,  id: 3 ]
const array2 = [ id: 1 ,  id: 2 ]

由于某种原因,我在 Google 上找不到解决方案。

我想过这个:

const result = array1.every(obj1 => 
  // what do use here? includes? contains?
)

console.log(result)

但我有点卡在代码中间。对我来说最合乎逻辑的解决方案是使用includes。但是,includes 似乎没有带函数:https://developer.mozilla.org/en-US/docs/Web/javascript/Reference/Global_Objects/Array/includes。所以我不确定是否可以通过 id 检查对象。

【问题讨论】:

【参考方案1】:

includes 仅当两个对象在内存中是相同的引用时才为真,(可能)不是这种情况。相反,我最初会创建array1ids 的Set,然后检查是否每个array2 id 都在集合中。这样,您只需在一开始就迭代 array1 一次(Sets 有 O(1) 查找时间):

const array1 = [ id: 1 ,  id: 2 ,  id: 3 ];
const array2 = [ id: 1 ,  id: 2 ];

const idSet = new Set(array1.map(( id ) => id));
console.log(
  array2.every(( id ) => idSet.has(id))
);

(数组没有contains 函数)

【讨论】:

【参考方案2】:
var matching = [];

for (var j = 0; j < array1.length; j++) 
    for (var i = 0; i < array2.length; i++) 
        if (array2[i].id === array1[j].id) 
            matching.push(array2[i].id);       
        
    


if (array2.length === matching.length) 
    console.log("All elements exist");
 else 
    console.log("One or more of the elements does not exist");

【讨论】:

【参考方案3】:

像这样,将Array.prototype.everyArray.prototype.some()结合使用:

const result = array2.every(o2 => array1.some(o1 => o1.id === o2.id));

这将检查array2 中的每个元素是否在array1 中都有匹配的元素。


这是一个完整的sn-p:

const array1 = [ id: 1 ,  id: 2 ,  id: 3 ];
const array2 = [ id: 1 ,  id: 2 ];

const result = array2.every(o2 => array1.some(o1 => o1.id === o2.id));

console.log(result);

如果array1很大,或者重复使用来执行这个操作,其他答案中提出的基于Set的方法更优化。

【讨论】:

【参考方案4】:

已经提出了类似类型的问题。您也可以在此链接上参考 Check if every element in one array is in a second array

const array1 = [ id: 1 ,  id: 2 ,  id: 3 ];
const array2 = [ id: 1 ,  id: 2 ];

let array1ids = array1.map(a => a.id);
const result = array2.every(a => array1ids.includes(a.id));
console.log(result);

const array3 = [ id: 1 ,  id: 2 ,  id: 3 ];
const array4 = [ id: 1 ,  id: 6 ];

let array3ids = array3.map(a => a.id);
const result2 = array4.every(a => array3ids.includes(a.id));
console.log(result2);

【讨论】:

【参考方案5】:

对于大型数组,我建议对用作创建 Set 的标准的数组进行预处理,以便每次检查都是 O(1) 查找和总体 O(n) 而不是 O(n^2) .这段代码做了几个假设,即:

条件基于objectselect() 函数、数组中的index 以及对array 的引用。 用作条件的选择返回一个原语,并且可以使用a === b || (a !== a &amp;&amp; b !== b) 执行与Set 相同的相等性检查(以处理abNaN

const has = select => array => 
  const set = new Set(array.map(select))
  return (object, index, array) => set.has(select(object, index, array))


const hasId = has(( id ) => id)
const array1 = [ id: 1 ,  id: 2 ,  id: 3 ]
const array2 = [ id: 1 ,  id: 2 ]

const result1 = array1.every(hasId(array2))
const result2 = array2.every(hasId(array1))

console.log(result1)
console.log(result2)

【讨论】:

以上是关于如何根据 JavaScript 中的值检查对象是不是在数组中?的主要内容,如果未能解决你的问题,请参考以下文章

如何检查一个对象是不是至少包含一个键,其值包含 JavaScript 中的子字符串?

如何检查数组是不是包含 JavaScript 中的值?

如何检查数组是不是包含 JavaScript 中的值?

如何检查 json 是不是包含 JavaScript 中的值?

如何检查获取的响应是不是是javascript中的json对象

如何检查javascript中的对象中是不是存在键[重复]