JavaScript中检查数组是否包含某个值的方法

JavaScript中检查数组是否包含某个值的方法

技术背景

在JavaScript编程中,经常需要检查一个数组是否包含特定的值。这在数据筛选、验证和逻辑判断等场景中非常常见。随着JavaScript的发展,出现了多种实现该功能的方法,不同的方法适用于不同的场景和需求。

实现步骤

1. 使用传统的for循环

1
2
3
4
5
6
7
8
function contains(a, obj) {
for (var i = 0; i < a.length; i++) {
if (a[i] === obj) {
return true;
}
}
return false;
}

使用示例:

1
2
const arr = [1, 2, 3];
console.log(contains(arr, 2)); // true

2. 使用Array.prototype.indexOf

1
2
const arr = [1, 2, 3];
console.log(arr.indexOf(2) >= 0); // true

3. 使用Array.prototype.includes

1
2
const arr = [1, 2, 3];
console.log(arr.includes(2)); // true

4. 使用Array.prototype.some

1
2
const items = [ {a: '1'}, {a: '2'}, {a: '3'} ];
console.log(items.some(item => item.a === '3')); // true

核心代码

1. 自定义contains函数

1
2
3
4
5
6
7
8
9
function contains(a, obj) {
var i = a.length;
while (i--) {
if (a[i] === obj) {
return true;
}
}
return false;
}

2. 扩展Array原型

1
2
3
4
5
6
7
8
9
Array.prototype.contains = function(obj) {
var i = this.length;
while (i--) {
if (this[i] === obj) {
return true;
}
}
return false;
}

使用示例:

1
console.log([1, 2, 3].contains(2)); // true

3. 基于JSON.stringify的对象比较

1
2
3
4
function contains(arr, obj) {
const stringifiedObj = JSON.stringify(obj);
return arr.some(item => JSON.stringify(item) === stringifiedObj);
}

使用示例:

1
console.log(contains([{a: 1}, {a: 2}], {a: 1})); // true

最佳实践

1. 对于基本数据类型

  • 如果是现代浏览器,优先使用Array.prototype.includes,因为它简洁且语义明确。
1
2
3
4
const arr = [1, 2, 3];
if (arr.includes(2)) {
// 执行相应操作
}
  • 如果需要兼容旧浏览器,可以使用Array.prototype.indexOf
1
2
3
4
const arr = [1, 2, 3];
if (arr.indexOf(2) >= 0) {
// 执行相应操作
}

2. 对于对象类型

  • 使用Array.prototype.some结合自定义的判断条件。
1
2
3
4
const items = [ {a: '1'}, {a: '2'}, {a: '3'} ];
if (items.some(item => item.a === '3')) {
// 执行相应操作
}

常见问题

1. indexOfincludes的区别

  • indexOf使用严格相等比较(===),而includes使用SameValueZero相等算法,这意味着includes可以检测NaN
1
2
3
const arr = [1, 2, NaN];
console.log(arr.indexOf(NaN)); // -1
console.log(arr.includes(NaN)); // true
  • indexOf返回元素的索引,includes返回布尔值。

2. 扩展Array原型的风险

扩展Array原型可能会引入新的属性到for-in循环中,从而破坏现有的脚本。因此,除非确定不会对其他代码产生影响,否则建议使用独立的函数。

3. 性能问题

不同的方法在性能上可能存在差异,尤其是在处理大型数组时。例如,使用JSON.stringify进行对象比较可能会比较慢,因为它涉及到对象的序列化。在性能敏感的场景中,建议进行性能测试来选择最合适的方法。


JavaScript中检查数组是否包含某个值的方法
https://119291.xyz/posts/2025-04-17.javascript-array-value-checking-methods/
作者
ww
发布于
2025年4月17日
许可协议