2017-03-20 58 views
2

我有以下簡單的數組:Javascript跟蹤數組中元素之間的差異?

my_array = [1, 11, 44, 4] 

我想生產由這些元素之間的差異的一個新的數組,所以這將是:

diff_array = [10, 33, 40] 

什麼是要去了解的最佳途徑這個?

+0

您正在尋找*最好的方式*,但你沒有顯示你的代碼。如果任何一種方法比你的方法更好,我們將如何比較? – Rajesh

回答

6

您可以使用Array#reduce進行迭代,並獲取推送到結果數組的絕對差值。

基本上你需要array.length - 1增量和迭代。在這種情況下,3。減少需要,如果沒有給出起始值,則前兩個元素並迭代所需的長度。雖然它需要增量的最後一個值,但最後一個值會返回。

最後,reduce的返回值被丟棄,因爲它不再被使用。

1 11 44 4 values 
\/\/\/
    10 33 40  Math.abs(delta) 

var array = [1, 11, 44, 4], 
 
    result = []; 
 
    
 
array.reduce(function (a, b) { 
 
    result.push(Math.abs(a - b)); 
 
    return b; 
 
}); 
 

 
console.log(result);

+0

你能解釋它爲什麼有效嗎?特別是'return'聲明。謝謝! – Mistalis

+0

@Mistalis請參考[Array.reduce](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/Reduce)和[它是如何工作的](http:// stackoverflow.com/questions/5732043/javascript-reduce-on-array-of-objects)解釋 – Rajesh

+0

此方法比循環遍歷數組要慢得多。 – wdetac

2

使用該功能,通過它輸入數組,返回所需的陣列。

function diff(array){ 
var out = [] 
for (var i = 0; i < array.length-1; i++) { 
    out.push(Math.abs(array[i+1]-array[i])) 
} 
return out; 
} 
+1

請添加說明。 – Rajesh

3

這裏是一個普通的舊for

array = [1, 11, 44, 4] 
diff = [] 

for(var i = 1 ; i < array.length ; i++){ 
    diff.push(Math.abs(array[i] - array[i-1])) 
} 

基本上就開始循環在陣列的所述第二元件的簡單的解決方案,,並從分組中減去並推到新數組。

1

通常人們可以用.reduce()做到這一點,但只是爲了好玩,讓我們可以得到一些功能。

var myArray = [1, 11, 44, 4], 
 
     diff = a => a.length > 1 ? [Math.abs(a[1]-a[0])].concat(diff(a.slice(1))) : []; 
 

 
console.log(diff(myArray));

注:上面的代碼只是爲了演示的目的。在你日常的JS生活中,你不應該這樣做。使用你喜歡的任何循環,但從不在你的JS代碼中使用遞歸。你想知道我的意思嗎?喂這個數組。

var myArray = Array(1000000).fill().map(_ => ~~(Math.random()*100+1)); 

它會很好地崩潰您的瀏覽器的選項卡。 Peah ..!

+0

這個比'for for loop'方法更快,但難以閱讀。所以它可能不是最好的。 – wdetac

+0

@wdetac我同意,JS本身變得非常精神分裂症。儘管上面的代碼非常簡單,與其他語言不同,JS有很多不同的方式來表達同樣的東西。你不應該知道所有這些。在Haskell中,你有一個非常嚴格的語法和某些實現你的目標的方法。在JS中,你有while循環,for循環,遞歸,函數,for循環,for循環我的意思是來吧。你可能完全熟悉JS,並且可能很難理解一個簡單的代碼。這不是你的錯,它是JS在同一時間既努力又有功能。 – Redu

+0

@wdetac順便說一句,我認爲這個代碼的性能沒有靠近'.reduce()'的地方,把for循環放在一邊。另外在JS中,除非可以保證數組長度非常有限,否則不應該對數組操作使用遞歸。實際上,在JS中,應該忘記總共的遞歸。這只是爲了好玩:) – Redu

相關問題