Это простой l oop, но для него нужно иметь два счетчика:
- Один - обычный счетчик, который предназначен для элементов, где
o
не содержит "t"
, а мы просто увеличивайте его каждый раз. - Другой - это смещение, добавляемое к
n
, когда o
содержит "t"
. Он начинается с нуля. - Он увеличивается на единицу для каждого последующего элемента, который соответствует условию.
- Он сбрасывается обратно в ноль, если мы перестаем обнаруживать элементы, соответствующие условию.
Используя только ES5, это может выглядеть так:
var data = [
{o:[],n:1}, //empty o could be our main counter this could also be dynamic or any number to start
{o:[],n:1},
{o:['t'],n:1}, //has t number start from n
{o:['t'],n:1},
{o:[],n:1}, // continue the last count of main counter
{o:[],n:1},
{o:['t'],n:1},
{o:[],n:1},
{o:[],n:1},
{o:['t'],n:5},
{o:['t'],n:5},
{o:['t'],n:5},
{o:[],n:1},
]
function recount(data) {
var counter = 1;
var offsetT = 0;
for (var i = 0; i < data.length; i++) {
var item = data[i];
if (item.o.indexOf("t") != -1) {
item.n = item.n + offsetT++;
} else {
offsetT = 0;
item.n = counter++;
}
console.log(item.n);
}
}
recount(data);
console.log(data);
Для полноты, версия кода ES6 почти такая же:
var data = [
{o:[],n:1}, //empty o could be our main counter this could also be dynamic or any number to start
{o:[],n:1},
{o:['t'],n:1}, //has t number start from n
{o:['t'],n:1},
{o:[],n:1}, // continue the last count of main counter
{o:[],n:1},
{o:['t'],n:1},
{o:[],n:1},
{o:[],n:1},
{o:['t'],n:5},
{o:['t'],n:5},
{o:['t'],n:5},
{o:[],n:1},
]
function recount(data) {
let counter = 1; //let instead of var
let offsetT = 0; //let instead of var
for (let item of data) { //for..of instead of a normal for
if (item.o.includes("t")) { //includes instead of indexOf
item.n = item.n + offsetT++;
} else {
offsetT = 0;
item.n = counter++;
}
console.log(item.n);
}
}
recount(data);
console.log(data);