【问题标题】:How to iterate over an array with underscore.js having the previous value as well as the current?如何使用具有先前值和当前值的 underscore.js 遍历数组?
【发布时间】:2014-01-16 00:41:38
【问题描述】:

有没有下划线(lo-dash)的简单神奇的函数组合来实现以下算法:

var arr = [1, 4, 9, 16, 25];
var result = [];
for(var i = 1, len = arr.length; i < len; ++i) {
    var current = arr[i];
    var previous = arr[i-1];
    result[i-1] = current - previous;
}
// result == [3, 5, 7, 9]

使用更简单的语法:

var arr = [1, 4, 9, 16, 25];
var result = _.???(arr, function(current, previous) {
    return current - previous;
}

?

注意事项:

  1. 我不想滚动自己的函数,我宁愿使用现有方法的组合。
  2. 显然我的数组包含对象而不是数字,结果可能是也可能不是数字列表。

【问题讨论】:

    标签: javascript algorithm iteration underscore.js


    【解决方案1】:

    只需使用_.map() 并使用i 并收集它给你。

    var arr = [1, 4, 9, 16, 25];
    var result = _.map(arr, function(curr, i, arr) {
        return i ? curr - arr[i-1] : null;
    }).slice(1);
    

    我在第一次迭代中返回了null,然后在最后将其切掉。

    http://jsfiddle.net/8aZnp/


    从技术上讲,_.reduce() 可以为您提供最新的和当前的项目,如果您始终返回当前项目。使用_.reduce 的方式有点骇人听闻,但它确实有效。

    var arr = [1, 4, 9, 16, 25];
    var result = [];
    _.reduce(arr, function (last, curr) {
        result.push(curr - last);
        return curr;
    });
    

    http://jsfiddle.net/8aZnp/1/

    【讨论】:

    • 如果你有 ES5 支持,reduceJavaScipt 中原生可用,并且可以使用与你提供的完全相同的功能 _.reduce (同样的map 可能也可以)
    • @PaulS.:AFAIK Underscore 将使用可用的本地函数。
    • 我会选择reduce,它看起来又好又容易。我总是使用库中的方法,因为它们会在不兼容的环境中为我处理 polyfill。 (前几天我不小心尝试了_.slice :)
    • 注意:reduce 的这种用法在underscore 中没有记录,但在lo-dash 中有记录:“如果未提供累加器,则集合的第一个元素将用作初始累加器值。"
    【解决方案2】:

    我想出的另一种方法是:

    var arr = [1, 4, 9, 16, 25];
    _.map(_.zip(_.rest(arr , 1), _.first(arr, arr.length - 1)), function(pair) {
        var current = pair[0];
        var previous = pair[1];
        return current - previous;
    });
    

    但是这个解决方案是O(4n)(给定mapziprestfirst是线性的)并且非常冗长。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-11-25
      • 2022-01-18
      • 1970-01-01
      • 1970-01-01
      • 2022-01-07
      • 1970-01-01
      • 2018-03-07
      相关资源
      最近更新 更多