Скажем, у меня есть массив оценок:
const scores = [20, 0, 30, 40, 50, 60, 70, 80, 90, 100, 110, 120];
По умолчанию я показываю оценку текущего месяца (scores[0]
) и оценку предыдущего месяца (scores[1]
).
Если предыдущий месяц 0
, я хочу отобразить последний индекс со значением, отличным от нуля. (scores[2]
в данном случае). Это означает, что у нас есть значения 0
от индекса 1
до 8
, я хочу отобразить индекс 9
как результат предыдущего месяца.
for (let i = 0; i < scores.length; i++) {
if (scores[i] === 0) {
// At this point I want to skip to the next index.
// If the next index is also zero, I skip till I get an index with a value
}
}
Каков ожидаемый результат?
Вы можете использовать Array#find, чтобы получить первый ненулевой элемент.
let res = scores.find((x, i) => i && x !== 0);
Вам просто нужно использовать оператор continue, вот так:
const scores = [20, 0, 30, 40, 50, 60, 70, 80, 90, 100, 110, 120];
for (let i = 0; i < scores.length; i++) {
if (scores[i] === 0) {
continue;
}
// do stuff
}
Вы должны использовать continue
, который в основном переходит к следующей итерации, поэтому ваш код будет выглядеть примерно так:
for (let i = 0; i < scores.length; i++) {
if (scores[i] === 0) {
continue;
}
}
Если вы хотите получить первое ненулевое значение, просто найдите первый индекс, начинающийся с 0. После того, как вы найдете это значение, найдите следующее значение, следующее за этим индексом.
const fromIndex = (callbackFn, fromIndex) =>
(element, index, array) =>
index >= fromIndex && callbackFn(element, index, array);
const getBreakdown = (scores, criteria) => {
const currentIndex = scores.findIndex(criteria);
const previousIndex = scores.findIndex(fromIndex(criteria, currentIndex + 1));
return {
current: scores[currentIndex],
previous: scores[previousIndex],
};
};
const
scores = [20, 0, 30, 40, 50, 60, 70, 80, 90, 100, 110, 120],
breakdown = getBreakdown(scores, (score) => score > 0);
console.info(breakdown);
Кроме того, вы всегда можете отфильтровать ненулевые значения:
const getBreakdown = (scores, criteria) => {
const [current, previous] = scores.filter(criteria);
return { current, previous };
};
const
scores = [20, 0, 30, 40, 50, 60, 70, 80, 90, 100, 110, 120],
breakdown = getBreakdown(scores, (score) => score > 0);
console.info(breakdown);
while ( scores[i] === 0 ) i++;