l oop и создать нумерацию с базой условий в ключе объекта массива в javascript - PullRequest
0 голосов
/ 04 августа 2020

Привет, я пытаюсь создать этот тип l oop шаблона на основе ключевого условия объекта массива, если 'o' имеет 't' , мы начнем индекс от начальной точки 'n' в объекте, иначе мы продолжаем нумерацию с основного счетчика

массив данных:

 let 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}, 
]

затем, когда я запускаю этот код:

 recount(data){
   for (var i = 0; i < data.length; i++) {
     //code here 
     //new can also modify data[i].n
     console.log(**numbering**)
   }
 }

ожидаемый результат

//numbering
//1,2,1,2,3,4,1,5,6,5,6,7,7

Спасибо за помощь

Ответы [ 2 ]

1 голос
/ 04 августа 2020

- это простой алгоритм, если вам нужна помощь, чтобы понять его, дайте мне знать, и я могу объяснить вам все, что вы не понимаете

let 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 },
  ];
  
  let numbering = 1;
  let secNumbering;
  let previous = false;
  
  function recount(data) {
    for (var i = 0; i < data.length; i++) {
      if (data[i].o.includes("t")) {
        if (previous) {
          secNumbering += 1;
          console.log(secNumbering);
          previous = true;
        } else {
          secNumbering = data[i].n;
          console.log(secNumbering);
          previous = true;
        }
      } else {
        console.log(numbering);
        numbering += 1;
        previous = false;
      }
    }
  }
  
  recount(data);
  
1 голос
/ 04 августа 2020

Это простой 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);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...