【问题标题】:How to supply an equals/hash function to JS Array.includes()? [duplicate]如何为 JS Array.includes() 提供 equals/hash 函数? [复制]
【发布时间】:2025-12-01 17:45:01
【问题描述】:

有没有办法让Array.prototype.includes() 也可以通过提供等于+哈希谓词来处理非原始对象?

例如给定一个列表:

var list = [{id:111},{id:222},{id:333}];

console.log(list.includes({id:333});
// output: false

从上面的例子看来,相等是由对象标识(即内存地址)而不是由值完成的,这当然是完全有意义的,也是预期的。但是有没有办法为list.includes() 提供一个相等函数,以便使用id 的原始值来确定相等?

Arrays.includes() 文档没有提到任何关于接受相等谓词的内容。

【问题讨论】:

标签: javascript arrays equals contains predicate


【解决方案1】:

Array#includes 有两个参数:

searchElement:要搜索的值。

fromIndex(可选):此数组中开始搜索 searchElement 的位置。

您可以改用Array#some

const list = [{id:111},{id:222},{id:333}];

console.log( list.some(({id}) => id === 333) );

【讨论】:

  • 太棒了!谢谢!尽管引入了单独的方法some() 而不是让includes() 接受可选谓词,但这是出乎意料的;对我来说,从逻辑上讲,some()includes() 相同。
  • @ccpizza includes 搜索指定值;您不想为每个值创建单独的函数;但您也应该能够搜索函数对象。
  • Array#includes 使用sameValueZero 算法来确定是否找到了一个元素。你可以阅读更多关于它的信息。 Array#some 测试数组中是否至少有一个元素通过了提供的函数实现的测试