[英]Manipulate previous item inside Array.map?
我正在使用Array.prototype.map()
轉換數組,如果當前項目匹配某些條件,我想更改其上一個項目。
下面的代碼似乎無法正常工作,如何在沒有for
循環的情況下執行此操作?
var nums = [1, 2, 3, 4, 5]; var res = nums.map((item, index, array) => { if (item > 3) { array[index - 1] += 1; } return item; }); console.log(res); // [ 1, 2, 3, 4, 5 ], I want [1, 2, 4, 5, 5]
從.map
創建過程中的數組不能像這樣引用。 而是在forEach
之外創建數組,然后將其推入/分配給它:
var nums = [1, 2, 3, 4, 5]; const newArr = []; nums.forEach((item, index) => { if (item > 3) newArr[index - 1] += 1; newArr.push(item); }); console.log(newArr); // I want [1, 2, 4, 5, 5]
您可以使用減速器
var res = [1, 2, 3, 4, 5] .reduce((reduced, item, i) => { i && (reduced[i-1] += item > 3 ? 1 : 0); return [...reduced, item]; }, []); console.log(res);
免責聲明:之所以只提供此答案,是因為我感到每當有人問“如何在不使用for循環的情況下執行X”時,我都感到所有地圖之間都應至少有一個遞歸解決方案,並減少:)
沒有for循環,我該怎么做?
如果您不太在意性能或堆棧崩潰的風險,則可以使用遞歸函數!
這是一個例子:
first
, second
和其余 first
為空,則說明計算已結束,並返回結果 first
不為空,則可以將其與second
進行比較以確定其值。 我們將值添加到結果中並遞歸: [second, ...rest]
並傳遞結果 const input = [ 1, 2, 3, 4, 5 ]; const Empty = Symbol(); const incIfBt3 = ([first = Empty, second, ...rest], result = []) => first === Empty ? result : incIfBt3( [second, ...rest], [...result, first + (second > 3)] ); console.log(incIfBt3(input));
您可以向前看而不是向后看:
var nums = [1, 2, 3, 4, 5];
var res = nums.map((item, index, array) => {
if (array[index + 1] > 3) {
item += 1;
}
return item;
});
您可以使用array
參數查看下一個項目,並相應地返回當前項目的值,而不必嘗試更改上一個項目:
var nums = [1, 2, 3, 4, 5]; var res = nums.map((item, index, array) => item + (array[index + 1] > 3 ? 1 : 0)); console.log(res); // [1, 2, 4, 5, 5]
您還可以利用以下事實:布爾值的數字值為1或0來消除條件表達式:
var nums = [1, 2, 3, 4, 5]; var res = nums.map((item, index, array) => item + (array[index + 1] > 3)); console.log(res); // [1, 2, 4, 5, 5]
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.