【问题标题】:Javascript - How can I fetch a non zero value from an array?Javascript - 如何从数组中获取非零值?
【发布时间】:2013-12-23 13:52:07
【问题描述】:

我有一个数组,它一次只有一个非零值以及其他 0 值。例如,它可能是

[0,0,0,0,0,0,0,1234,0,0,0] 
// or
[0,0,2823,0,0,0,0,0,0,0,0]
//...

我的问题是,如何使用 javascript 从数组中获取这个非零值。

我知道我可以遍历数组并在找到后立即返回非零值,但我想知道 javascript 是否提供了任何功能来执行此操作?

【问题讨论】:

  • @VisioN 给出了一个很好的答案,但应该注意 something 将遍历数组。该答案中的功能方法很好,因为它“掩盖”了迭代,但在算法上它仍然是一个真正的成本。
  • @Pointy 取决于。函数方法能否比迭代方法更好地向量化? (我认为是反过来,迭代会更快)。
  • @JanDvorak 也许不错,但如果您正在执行传统的复杂性分析,则在无序列表中查找值是 O(n) 操作。
  • @Pointy 正确,但 O(N) 的每时钟周期 16 周期类型仍然比 O(N) 的每 16 周期周期类型好得多 :-)跨度>
  • 与例如 C# SortedList 不同,数组必须始终通过蛮力迭代以进行比较。因此,最快的方法是从一端到另一端。

标签: javascript jquery arrays


【解决方案1】:

你可以从数组中过滤掉它:

[0,0,0,0,0,0,0,1234,0,0,0].filter(function(x) { return x; }).pop();  // 1234

正如 cmets 中提到的 @Sarath,如果您的初始数组可能有其他 falsy 非数值(如 falseundefined'' 等),您可以添加严格比较:

[0,0,0,0,0,0,0,1234,0,0,0].filter(function(x) { return x !== 0; }).pop();

数值数组的另一个简短解决方案是使用reduce 方法:

[0,0,0,0,0,0,0,1234,0,0,0].reduce(function(a, b) { return a + b; }); // 1234

注意:检查浏览器对 filterreduce 方法的兼容性,并在需要时使用 polyfill。

【讨论】:

  • @JanDvorak 谢谢 :) 我刚刚从 here 复制了 N.B. 部分。
  • 更好的用户return x !== 0 如果他想要怎么办'',false,etc
  • @Sarath 我假设是一个数字数组
  • @Sarath 是的,这取决于输入数据。提供的方法将剔除所有虚假值。但是,如果 OP 假设数组中的值不是数值,那么您的提示将很有用。谢谢。
【解决方案2】:

考虑到您的问题,我只是想提供一个替代解决方案:

var foo = [0,0,0,0,0,0,0,1234,0,0,0],
    bar = [0,0,2823,0,0,0,0,0,0,0,0];

console.log(
    Math.max.apply(null, foo), // 1234
    Math.max.apply(null, bar)  // 2823
);

【讨论】:

  • 不是一个很好的例子,因为数组中的值可能是负数。
  • @VisioN 当问题中没有规定时,没有看到需要扩展示例。我认为它充分说明了存在不同的思维方式——这就是我所要理解的;)
猜你喜欢
  • 2021-09-24
  • 1970-01-01
  • 1970-01-01
  • 2012-05-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多