![](/img/trans.png)
[英]How to break out of async.js map's iterator loop when a condition is met
[英]Break out of map
所以我有這個問題,如果數組中的值高於輸入的值,它應該做一些事情然后停止循環並且不要觸摸數組中的剩余值..這是到目前為止的代碼:
const percentages = [];
let enteredValue = parseInt(event.target.value, 10);
range.map((rangeValue, i) => {
if (rangeValue <= enteredValue) {
percentages.push(100);
enteredValue = enteredValue - rangeValue;
} else {
percentages.push(enteredValue * 100 / (rangeValue));
return;
}
});
使用.some
您可以獲得類似於.forEach
、 map
或for
循環的迭代功能,但具有break
return
的能力。
range.some(function(rangeValue , i) { if (rangeValue <= enteredValue) { percentages.push(100); enteredValue = enteredValue - rangeValue; return true } percentages.push(enteredValue * 100 / (rangeValue)); });
在此處閱讀有關.some
中的es6
更多信息
只需使用一個很好的 for 循環:
const percentages = [];
let enteredValue = parseInt(event.target.value, 10);
for(const range of ranges) {
percentages.push(Math.min(100, (enteredValue / range) * 100));
enteredValue -= range;
if(enteredValue <= 0) break;
}
其他答案完全足夠。 但是,我想補充一點, map
函數不適合用於執行迭代。 map
函數所做的是對數組的每個元素執行回調中傳遞的 as 參數。 然后返回新數組。 因此,當您需要數組的變異副本(例如,所有元素乘以 10)時,map 更有用。
出於您的目的,其他邏輯(如常規 for 循環)將是更優雅的解決方案。
您可以使用reduce
而不是map
。 reduce
感知原始數組的變化。
let enteredValue = parseInt(event.target.value, 10);
const percentages = range
.slice(0) // if you don't want to mess up the original array
.reduce((percentages, rangeValue, _, rangeCopyArray) => {
if (rangeValue <= enteredValue) {
percentages.push(100);
enteredValue -= rangeValue;
} else {
percentages.push(enteredValue * 100 / rangeValue);
rangeCopyArray.length = 0; // the loop ends here
}
return percentages;
}, [])
或更短但不太清楚
const percentages = [...range].reduce(({p, eV}, rV, _, arr) => ({
eV: eV-rV,
p: [...p, rV <= eV ? 100 : eV*100/rV + (arr.length = 0)]
}), {p: [], eV: parseInt(event.target.value, 10)}).p;
從地圖中突破 - 使用return
let hasId = false;
let data = {
id: 1,
title: 'some item'
}
let cartArray = [{
id: 1,
quantity: 19
}];
if (cartArray.length > 0) {
cartArray.map(item => {
if (item.id === data['id']) {
++item.quantity;
hasId = true
return; // Break out
}
})
if (!hasId) {
cartArray.push(data)
}
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.