所以我有这个问题,如果数组中的值高于输入的值,它应该做一些事情,然后停止循环,不要触摸数组中的剩余值。这里是' s代码到目前为止:
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;
}
});
答案 0 :(得分:6)
使用.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));
});
&#13;
在.some
here
es6
答案 1 :(得分:3)
只需使用旧的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;
}
答案 2 :(得分:2)
其他答案完全足够。但是,我想补充一点,map
函数不是最适合执行迭代的。 map
函数执行的操作是在数组的每个元素的回调中执行as参数。然后返回新数组。因此,当您需要阵列的变异副本时(例如,所有元素乘以10),map更有用。
为了您的目的,像常规for循环这样的其他逻辑将是一个更优雅的解决方案。
答案 3 :(得分:1)
从地图中突破-使用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)
}
}
答案 4 :(得分:0)
您可以使用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;