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

JavaScript的.includes()方法在对象数组中无法正常工作的问题

判断数组是否包含指定内容对象的正确方法

这问题我太熟悉了!你遇到的情况是因为 includes() 方法的判断逻辑导致的——它用的是**严格相等(===)**来比较元素,而对象属于引用类型:你传入的 { name: "object1" } 和数组里的那个同名对象,是两个完全独立的内存引用,哪怕内容一模一样,=== 也会返回 false,所以 includes() 自然匹配不到。

正确的解决方式:用 Array.prototype.some()

some() 方法会遍历数组,只要有一个元素满足你定义的条件,就会返回 true,非常适合用来判断数组里是否存在内容匹配的对象。

1. 简单对象(单属性或少量属性)

直接在回调里比较对象的属性即可:

let list1 = [{ name: "object1" }, { name: "object2" }, { name: "object3" }, { name: "object4" } ]
if (list1.some(item => item.name === "object1")) {
  document.write('contains')
} else {
  document.write('doesnt')
}

2. 复杂对象(多属性需要完全匹配)

可以写一个通用的对象比较函数,再结合 some() 使用:

// 自定义对象深度比较函数(基础版)
function objectsAreEqual(objA, objB) {
  // 先判断是否是同一引用
  if (objA === objB) return true;
  // 判断属性数量是否一致
  const keysA = Object.keys(objA);
  const keysB = Object.keys(objB);
  if (keysA.length !== keysB.length) return false;
  // 逐个比较属性值
  for (const key of keysA) {
    if (objA[key] !== objB[key]) return false;
  }
  return true;
}

// 使用示例
let list1 = [{ name: "object1", id: 1 }, { name: "object2", id: 2 }]
const targetObj = { name: "object1", id: 1 }

if (list1.some(item => objectsAreEqual(item, targetObj))) {
  document.write('contains')
} else {
  document.write('doesnt')
}

3. 快捷但有局限的方式:JSON.stringify()

如果你的对象是纯数据类型(没有函数、undefined、Symbol这类JSON无法处理的类型),且属性顺序固定,可以把对象转成字符串后比较:

let list1 = [{ name: "object1" }, { name: "object2" }]
if (list1.some(item => JSON.stringify(item) === JSON.stringify({ name: "object1" }))) {
  document.write('contains')
}

⚠️ 注意:这种方法有坑——如果对象属性顺序不同(比如{name: "a", age: 1}和{age:1, name:"a"}),转成字符串后会不一样,而且无法处理JSON不支持的类型,所以只适合简单场景。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.28 03:59:16