【问题标题】:indexOf with multiple arguments具有多个参数的 indexOf
【发布时间】:2016-08-17 15:00:12
【问题描述】:

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

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

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

所以如果array = [123] 那么我的indexOf 应该是0 因此true

如果array = [124] 那么我的indexOf 应该是0,因此true

我发现[123] 工作正常,但它甚至不需要检查indexOf 的第二个或第三个参数,只是返回错误。

http://codepen.io/anon/pen/WxmyGp?editors=0011

【问题讨论】:

标签: javascript arrays indexof


【解决方案1】:

|| 运算符如果为真则返回左侧,否则返回右侧。 123 || 124 || 125 仅表示123

如果你想测试多个值中的任何一个是否在一个数组中,那么你必须依次测试每个值。

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

由于您只关心数组的一个特定索引,因此您可以将整个事情放在头上:

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

【讨论】:

  • @dave 两者都有O(m * n) 复杂性。您的方法只是将m 表达式与||s 连接起来。 Quentin 的实现在 Chrome 中的运行速度似乎比你的快得多:plnkr.co/edit/yz9VRRJ3D0pIMqbSunJJ?p=preview
  • @JLRishe 显然这些结果不言自明,但我很难理解为什么。我发布了related question 来询问为什么这种方法更快。
【解决方案2】:

您可以使用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]));

【讨论】:

  • 如果我正确阅读了 Q,解决方案将是一个简单的array == [123] || array == [124] || array == [125]
  • @Boldewyn — 否。== 测试双方是否是同一个对象。不同的数组即使相同也不会匹配。
【解决方案3】:

如果您想获得多个结果,另一种方法是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);

【讨论】:

    猜你喜欢
    • 2023-04-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-07-21
    • 2011-04-15
    • 2011-08-01
    • 2021-08-01
    • 1970-01-01
    相关资源
    最近更新 更多