我有以下簡單的數組:Javascript跟蹤數組中元素之間的差異?
my_array = [1, 11, 44, 4]
我想生產由這些元素之間的差異的一個新的數組,所以這將是:
diff_array = [10, 33, 40]
什麼是要去了解的最佳途徑這個?
我有以下簡單的數組:Javascript跟蹤數組中元素之間的差異?
my_array = [1, 11, 44, 4]
我想生產由這些元素之間的差異的一個新的數組,所以這將是:
diff_array = [10, 33, 40]
什麼是要去了解的最佳途徑這個?
您可以使用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);
你能解釋它爲什麼有效嗎?特別是'return'聲明。謝謝! – Mistalis
@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
此方法比循環遍歷數組要慢得多。 – wdetac
使用該功能,通過它輸入數組,返回所需的陣列。
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;
}
請添加說明。 – Rajesh
這裏是一個普通的舊for
環
array = [1, 11, 44, 4]
diff = []
for(var i = 1 ; i < array.length ; i++){
diff.push(Math.abs(array[i] - array[i-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 ..!
這個比'for for loop'方法更快,但難以閱讀。所以它可能不是最好的。 – wdetac
@wdetac我同意,JS本身變得非常精神分裂症。儘管上面的代碼非常簡單,與其他語言不同,JS有很多不同的方式來表達同樣的東西。你不應該知道所有這些。在Haskell中,你有一個非常嚴格的語法和某些實現你的目標的方法。在JS中,你有while循環,for循環,遞歸,函數,for循環,for循環我的意思是來吧。你可能完全熟悉JS,並且可能很難理解一個簡單的代碼。這不是你的錯,它是JS在同一時間既努力又有功能。 – Redu
@wdetac順便說一句,我認爲這個代碼的性能沒有靠近'.reduce()'的地方,把for循環放在一邊。另外在JS中,除非可以保證數組長度非常有限,否則不應該對數組操作使用遞歸。實際上,在JS中,應該忘記總共的遞歸。這只是爲了好玩:) – Redu
您正在尋找*最好的方式*,但你沒有顯示你的代碼。如果任何一種方法比你的方法更好,我們將如何比較? – Rajesh