You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在对象数组中查找元素?使用Array.includes判断存在元素总返回false

问题原因

JavaScript中Array.prototype.includes()方法内部使用**严格相等(===)**进行值比较。对于对象这类引用类型数据,===比较的是对象在内存中的引用地址,而非对象内部的属性值。你代码里数组中存储的{x: "c", y: 3}和单独声明的elem是两个完全独立的对象,指向不同的内存地址,所以includes判断结果必然是false。

解决方案

你可以用以下几种常用方式实现对象数组的元素匹配:

1. 用Array.prototype.some()按属性匹配

这是最常用的方案,可自定义匹配规则判断对象属性是否符合要求:

const arr = [
  {x: "a", y: 1},
  {x: "b", y: 2},
  {x: "c", y: 3}
];
const elem = {x: "c", y: 3};

// 匹配所有属性值相等
const isExist = arr.some(item => item.x === elem.x && item.y === elem.y);
console.log(isExist); // 输出 true

如果对象属性较多,也可以把属性校验抽成通用逻辑:

function isObjectEqual(obj1, obj2) {
  // 先判断引用地址是否相同
  if (obj1 === obj2) return true;
  // 判断两个对象的key数量是否一致
  const keys1 = Object.keys(obj1);
  const keys2 = Object.keys(obj2);
  if (keys1.length !== keys2.length) return false;
  // 遍历判断每个属性值是否相等(仅适用于属性值为基础类型的场景)
  return keys1.every(key => obj1[key] === obj2[key]);
}

const isExist = arr.some(item => isObjectEqual(item, elem));

2. 序列化后比较(简单场景适用)

如果对象结构简单,没有循环引用、函数、Symbol等特殊类型,也可以通过JSON.stringify()转为字符串后比较:

const isExist = arr.some(item => JSON.stringify(item) === JSON.stringify(elem));

注意:该方法对属性顺序敏感,如果两个对象属性顺序不同会导致判断错误,仅推荐明确对象结构固定的场景使用。

3. 直接存储对象引用

如果后续需要频繁判断该对象是否在数组中,也可以在创建时直接保存引用,就可以正常用includes判断了:

const elem = {x: "c", y: 3};
const arr = [
  {x: "a", y: 1},
  {x: "b", y: 2},
  elem // 直接把elem存入数组,引用地址一致
];

console.log(arr.includes(elem)); // 输出 true

内容的提问来源于stack exchange,提问作者NewDevUser

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.03 05:27:02