JavaScript:使用`.includes`查找对象数组中是否包含特定对象

19

我对JavaScript ES6还有点陌生,我不太理解为什么以下代码没有按照预期工作:

let check = [{name: 'trent'},{name: 'jason'}].includes({name: 'trent'}); 
// expect true - returns false

谢谢!


Array.prototype.includes 使用 SameValueZero 算法来确定值之间的相等性。相关问题:如何比较对象的 Array.prototype.includes 函数 - Sebastian Simon
7个回答

24

includes 的作用是检查是否存在与你搜索的元素相等的任何元素。对于对象而言,=== 意味着完全相同的对象,也就是相同的引用(内存中的同一位置),而非相同的形状。

var a1 = { name: 'a' }
var a2 = { name: 'a' }

console.log(a1 === a2) // false because they are not the same object in memory even if they have the same data

但是,如果您搜索的对象确实在数组中,则它会起作用:

var a1 = { name: 'a' }
var a2 = { name: 'a' }
var array = [a1, a2]

console.log(array.includes(a1)) // true because the object pointed to by a1 is included in this array 


20

管道传输

let check = [{name: 'trent'}, {name: 'jason'}]
  .map(item => item.name)
  .includes('trent');

简单又快速

let check = [{name: 'trent'}, {name: 'jason'}].some(el => el.name === 'trent')

1
这很棒,我认为你应该能够在这些情况下使用map/includes,但我不确定具体的方法,谢谢。 - Sara Inés Calderón

11

它无法工作是因为对象从未相同,每个对象都有自己的引用:

使用array.prototype.some代替:

const arr = [{name: 'trent'},{name: 'jason'}];
const obj = {name: 'trent'}; 
const check = arr.some(e => e.name === obj.name);
console.log(check);


2

includes 检查值是否存在于数组中,在您的情况下,该值是引用值,对于每个字面值的声明都是不同的(即使字面值相同)

Demo

var a = {name: 'trent'};
var b = {name: 'jason'};
[a,b].includes(a);  //true

请使用some代替,以匹配整个对象:
var objToFind = JSON.stringify( {name: 'trent'} );
let check = [{name: 'trent'},{name: 'jason'}].map( s => JSON.stringify( s ) ).some( s => s == objToFind ); 

1
includes() 方法用于确定数组是否包含某个元素,如果包含则返回 true,否则返回 false。但是在比较两个对象时,它们不相等。它们应该具有相同的内存引用才能相互等于。

你可以使用类似下面的方法:

var arr = [{name : "name1"}, {name : "name2"}];

var objtoFind = {name : "name1"}
var found = arr.find(function(element) {
  return element.name === objtoFind.name  ;
});
console.log((found ? true : false));


1

检查数组是否包含一个 x,y 对:

这是Faly's answer的一个实现,我已经使用过多次。

如果您有一个XY坐标对的数组,例如:

var px=[{x:1,y:2},{x:2,y:3},{x:3,y:4}];

如果您需要检查数组px是否包含特定的XY对,请使用以下函数:

function includesXY(arr,x,y){return arr.some(e=>((e.x===x)&&(e.y===y)));}

“所以,针对上述 px 数据集:”
console.log( includesXY( px, 2, 3) ); //returns TRUE
console.log( includesXY( px, 3, 3) ); //returns FALSE

var px=[{x:1,y:2},{x:2,y:3},{x:3,y:4}];

console.log( includesXY( px, 2, 3) ); //returns TRUE
console.log( includesXY( px, 3, 3) ); //returns FALSE

function includesXY(a,x,y){return a.some(e=>((e.x===x)&&(e.y===y)));}


(但我忘了如何使其可用,而不是 px.includesXY(x,y) ... 有人能帮忙吗?!) - ashleedawg

0
你可以使用Array.find()方法来检查数组中是否包含对象,因为"Array.includes检查'==='在数组中",这对于对象不起作用。 示例解决方案:
let check = [{name: 'trent'},{name: 'jason'}].find(element => element.name === 'trent'); 

1
在比较对象时,检查的是引用而不是内容 -> === 也适用于对象。 - Teemu

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接