如何使用Array.prototype.includes()查找对象?

时间:2018-07-09 21:27:59

标签: javascript arrays sorting ecmascript-6

示例代码:

const a = {val: 1};
const b = {val: 2};
const list = [a, b];

console.info(list.includes(a)); // true
console.info(list.includes({val: 1})); // false

问题:

  1. 为什么第二个语句的评估结果为假?
  2. 如何正确使用this method在对象数组中搜索特定对象?

2 个答案:

答案 0 :(得分:2)

TL; TR

list.some(value => JSON.stringify(value) === JSON.stringify({val: 1}));

答案:

  1. 首先,变量 a 是对象的引用链接。如果您使用list.includes(a)进行检查,则返回true,因为它找到了与先前const a = {val: 1};声明的对象的链接。

  2. 第二,list.includes({val: 1})返回false,因为您正在尝试搜索对新创建的对象-{val: 1}的引用。对象可能包含相同的值,并且结构相同,但是它们作为完全不同的对象存储在内存中。

如果要按结构检查同一对象,请使用Array.prototype.some()并为情况和逻辑编写比较器功能。

答案 1 :(得分:2)

这基本上可以归结为:

{ val: 1 } === { val: 1 }  // false

javascript中的对象通过引用进行比较,并且由于对象位于内存中的不同位置,因此它们并不相同。要检查将val设置为1的对象,必须手动搜索所有对象:

if(list.some(el => el.val === 1))