簡體   English   中英

在JavaScript中,如何優雅地創建數組元素的差異列表?

[英]In JavaScript how do I create a list of differences of array elements elegantly?

我有一個數字列表,比如numbers = [3,7,9,10] ,我希望有一個包含相鄰元素之間差異的列表 - 必須少一個元素 - 在給定的情況下, diffs = [4,2,1]

當然,我可以通過輸入列表創建一個新列表並手動編譯我的結果。

我正在尋找一種優雅/功能(不是說pythonic)的方式來做到這一點。 在Python中你會寫[ji for i, j in zip(t[:-1], t[1:])]或者使用numpy

JavaScript中是否有reduce() / list comprehension方法?

您可以切片並映射差異。

 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); 

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

您也可以在地圖后彈出:

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

你可以使用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) 

您可以使用解構賦值和遞歸 -

 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 ([])) // [] 

您可以切片(0表示開頭,-1表示跳過最后一項)並映射,以生成元素與序列中的后繼元素之間的差異:

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM