多参数 indexOf

3

在确定数组上的indexOf时,是否可以使用多个参数?

我想确定我的数组是否包含三个整数中的任何一个。需要注意的是,在此阶段,该数组将具有一个值(如果它具有更多值,则不会到达此代码块)。

array.indexOf(123 || 124 || 125) === 0

如果array = [123],那么我的indexOf应该是0,因此true
如果array = [124],那么我的indexOf应该是0,因此true
我发现的情况是[123]可以正常工作,但它甚至不会检查第二个或第三个参数的indexOf,只是返回false。 http://codepen.io/anon/pen/WxmyGp?editors=0011

3
indexOf 方法接受多个参数,例如 indexOf(1, 2, 3),在一般情况下没有太多意义,因为如果数组中存在多个元素,那么结果应该是什么呢? - deceze
如果您愿意使用lodash,请查看这里的答案:https://dev59.com/zonca4cB1Zd3GeqP9VO9 - adam0101
3个回答

11
||运算符如果左操作数为真则返回左操作数,否则返回右操作数。 123 || 124 || 125 表示的就是 123
如果您想测试数组中是否存在多个值中的任何一个,则必须逐个测试每个值。
array.indexOf(123) == 0 || array.indexOf(124) == 0 || array.indexOf(125) == 0 

既然你只关心数组中的一个特定索引,那么可以颠倒整个数组:

[123, 124, 125].indexOf(array[0]) > -1

1
@dave 两种方法的时间复杂度均为 O(m * n)。你的方法只是将 m 个表达式用 || 连接起来。Quentin 的实现在 Chrome 中似乎比你的快得多:https://plnkr.co/edit/yz9VRRJ3D0pIMqbSunJJ?p=preview - JLRishe
@JLRishe 显然这些结果说明了问题,但我很难理解为什么。我发布了一个相关问题,询问为什么那种方法更快。 - Dave

4
你可以使用 Array.some() 来实现这一点。
这种方法的好处是你只需要遍历数组一次。如果你将多个 indexOf() 调用用 || 连接起来,每次未找到搜索项时都会迭代整个数组。

function checkArray(array) {
  return array.some(function(item) {
    return item == 123 || item == 124 || item == 125;
  });
};

console.log(checkArray([123, 456, 789]));
console.log(checkArray([456, 789]));
console.log(checkArray([789, 456, 125]));


如果我正确理解了问题,解决方案将是一个简单的 array == [123] || array == [124] || array == [125] - Boldewyn
2
@Boldewyn — 不是的。== 测试两边是否为同一个对象。即使两个数组完全相同,它们也不会匹配。 - Quentin

-1
如果您想要获取多个结果,另一种方法是使用Array.prototype.filter()。但这将返回对象本身。如果您对索引感兴趣,则必须将其与Array.prototype.reduce()结合使用,例如:

var a = [1,2,3],
    b = a.filter(e => e === 1 || e === 2)
         .reduce((p,c) => p.concat(a.indexOf(c)),[]);
console.log(b);


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