如何根据 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
仅当两个对象在内存中是相同的引用时才为真,(可能)不是这种情况。相反,我最初会创建array1
的id
s 的Set
,然后检查是否每个array2
id
都在集合中。这样,您只需在一开始就迭代 array1
一次(Set
s 有 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.every
与Array.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) .这段代码做了几个假设,即:
object
的select()
函数、数组中的index
以及对array
的引用。
用作条件的选择返回一个原语,并且可以使用a === b || (a !== a && b !== b)
执行与Set
相同的相等性检查(以处理a
和b
是NaN
)
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 中的子字符串?
如何检查 json 是不是包含 JavaScript 中的值?