簡體   English   中英

處理Array.map中的上一個項目?

[英]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循環,我該怎么做?

如果您不太在意性能或堆棧崩潰的風險,則可以使用遞歸函數!

這是一個例子:

  • 將數組分解為firstsecond和其余
  • 如果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.

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