【问题标题】:In JavaScript how do I create a list of differences of array elements elegantly? [duplicate]在 JavaScript 中,如何优雅地创建数组元素的差异列表? [复制]
【发布时间】:2019-11-13 09:21:12
【问题描述】:

我有一个数字列表,比如numbers = [3,7,9,10],我想要一个列表 包含相邻元素之间的差异 - 必须有一个 更少的元素 - 在给定的情况下diffs = [4,2,1]

当然我可以通过输入列表创建一个新列表并编译我的 手动结果。

我正在寻找一种优雅/实用(不是说 pythonic)的方式来做到这一点。 在 Python 中,您可以编写 [j-i for i, j in zip(t[:-1], t[1:])] 或使用 numpy 为此。

JavaScript 中是否也有 reduce()/list 理解方法?

【问题讨论】:

  • 你有没有考虑过使用像lodash这样的库?

标签: javascript arrays ecmascript-6 functional-programming


【解决方案1】:

您可以对差异进行切片和映射。

var numbers = [3, 7, 9, 10],
    result = numbers.slice(1).map((v, i) => v - numbers[i]);

console.log(result);

一种相反的方法,稍后进行切片。

var numbers = [3, 7, 9, 10],
    result = numbers.map((b, i, { [i - 1]: a }) => b - a).slice(1);

console.log(result);

【讨论】:

    【解决方案2】:

    您可以使用reduce 方法来做到这一点

    const numbers = [3, 7, 9, 10]
    const res = numbers.reduce((r, e, i, a) => i ? r.concat(e - a[i - 1]) : r, []);
    console.log(res)

    【讨论】:

      【解决方案3】:

      你也可以在地图之后弹出:

      var numbers = [3, 7, 9, 10],
      result = numbers.map((v, i) => numbers[i+1]-v);
      result.pop()
      
      console.log(result);

      【讨论】:

        【解决方案4】:

        您可以使用mapslice

        const numbers = [3, 7, 9, 10, 11, 13];
        
        
        const res = numbers.map((num, index) => numbers[index + 1] - num).slice(0, -1);
        
        
        
        console.log(res)

        【讨论】:

          【解决方案5】:

          你可以使用解构赋值和递归-

          const diff = ([ a, b, ...more ]) =>
            b === undefined
              ? []
              : [ b - a, ...diff ([ b, ...more ]) ]
              
           
          console .log (diff ([ 3, 7, 9, 10 ]))
          // [ 4, 2, 1 ]
          
          console .log (diff ([ 3 ]))
          // []
          
          console .log (diff ([]))
          // []

          或者通过使用索引跳过一些中间值 -

          const diff = (a = [], i = 1) =>
            i >= a.length
              ? []
              : [ a[i] - a[i - 1], ...diff (a, i + 1) ]
              
          console .log (diff ([ 3, 7, 9, 10 ]))
          // [ 4, 2, 1 ]
          
          console .log (diff ([ 3 ]))
          // []
          
          console .log (diff ([]))
          // []

          如果需要,使用 looprecur 使其成为堆栈安全的。这个也跑得真快-

          const recur = (...values) =>
            ({ recur, values })
            
          const loop = f =>
          { let r = f ()
            while (r && r.recur === recur)
              r = f (...r.values)
            return r
          }
          
          const push = (a = [], v) =>
            ( a .push (v)
            , a
            )
            
          const diff = (a = []) =>
            loop
              ( ( i = 1
                , r = []
                ) =>
                  i >= a.length
                    ? r
                    : recur
                        ( i + 1
                        , push (r, a[i] - a[i - 1])
                        )
              )
              
          console .log (diff ([ 3, 7, 9, 10 ]))
          // [ 4, 2, 1 ]
          
          console .log (diff ([ 3 ]))
          // []
          
          console .log (diff ([]))
          // []

          【讨论】:

            【解决方案6】:

            您可以切片(0 作为开始,-1 跳过最后一项)和映射,以便生成序列中元素与其后继元素之间的差异:

                const items = [3,7,9,10];
                console.log(items.slice(0,-1).map((e,i)=>items[i+1]-e))

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 2019-10-22
              • 2012-03-12
              • 2010-10-29
              • 1970-01-01
              • 1970-01-01
              • 2019-06-27
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多