【问题标题】:How to use Array.prototype.includes() to find an object?如何使用 Array.prototype.includes() 查找对象?
【发布时间】:2018-12-17 15:39:50
【问题描述】:
示例代码:
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
问题:
- 为什么第二个语句的评估结果为假?
- 如何正确使用this method 在对象数组中搜索特定对象?
【问题讨论】:
标签:
javascript
arrays
sorting
ecmascript-6
【解决方案1】:
TL;TR
list.some(value => JSON.stringify(value) === JSON.stringify({val: 1}));
答案:
首先,变量a 是指向对象的引用链接。如果您使用list.includes(a) 进行检查,它会返回true,因为它找到了指向您之前声明的const a = {val: 1}; 的同一对象的链接。
其次,list.includes({val: 1}) 返回false,因为您正在尝试搜索对新创建的对象 - {val: 1} 的引用。对象可能包含相同的值和相同的结构,但它们作为完全不同的对象存储在内存中。
如果您想按结构检查相同的对象,请使用Array.prototype.some() 并为您的案例和逻辑编写比较器函数。
【解决方案2】:
这基本上归结为:
{ val: 1 } === { val: 1 } // false
javascript中的对象是通过引用进行比较的,由于对象在内存中的位置不同,所以它们并不相同。要检查将val 设置为1 的对象,ypu 必须手动搜索所有对象:
if(list.some(el => el.val === 1))