Проблема цикла с участием массивов - PullRequest
1 голос
/ 15 июня 2019

Я пытаюсь создать цикл for, основанный на смоделированных метаданных.

Данные представляют содержимое данных.

Мета представляет 3 различных типа метаданных.Если есть 1, это означает, что мета присутствует в данных, если есть 0, это означает, что его нет.

Размер представляет размер каждой информации, если метаданныеподарок.Так что если есть метаданные 1 1 1 размером 3:

  • , которые представляют мета 1 первые 3 элемента в массиве, мета 2 следующие 3 элемента в массиве,meta 3 следующие 3 элемента в массиве.

Проблема, с которой я сталкиваюсь, заключается в правильном чтении в последовательном порядке слева направо, и если у него заканчиваются данные, чтобы не создать новый, просто прекратите чтениеиз массива.

Если у нас есть данные [1, 2, 3, 4, 5] и мета 1, 1, 1, размер 1, это должно быть:

Meta 1: 1

Мета 2: 2

Мета 3: 3

Или если это были данные [1, 2, 3 4, 5, 6, 7, 8,9, 10, 11, 12] и мета 1, 0, 1, размер 4, это должно быть:

Мета 1: 1 2 3 4

Мета 2: Ничего

Мета 3: 5 6 7 8

Что у меня есть до сих пор:

let data = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10];
let meta = [1, 0, 1];
let size = 4;

for (let i = 0; i < 3; i++) {
  if (meta[i]) {
      if (i == 0) {
          console.log('Meta', 1);
          for (let i = 0; i < size; i++) {
              console.log(data[i]);
          }
      }
      if (i = 1) {
        console.log('Meta', 2);
        for (let i = 0; i < size; i++) {
              console.log(data[i] + size);
          }
      }
      if (i = 2) {
        console.log('Meta', 3);
         for (let i = 0; i < size; i++) {
              console.log(data[i] + size + size);
          }
      }
  }
}

Ответы [ 3 ]

2 голосов
/ 15 июня 2019

Вы можете удалить свои внутренние операторы if, поскольку они являются дубликатами, и вместо этого использовать переменную i, чтобы вывести i th плюс мета-значение.

В приведенном ниже фрагменте я создал переменную j, которая используется для отслеживания того, в какой точке данных мы находимся. Используется для перехода по сегментам size, когда найден каждый meta.

Затем во внутреннем цикле for I выполняется цикл от j до j+size, который является определенной частью вашего data массива длины size.

См. Пример ниже:

let data = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10];
let meta = [1, 0, 1];
let size = 4;

let j = 0;
for (let i = 0; i < meta.length; i++) {
  console.log('Meta', i+1);
  if (meta[i]) {
      for(let k = j; k < j+size && k < data.length; k++) {
        console.log(data[k]);
      }
      j+=size;
  } else {
    console.log("-- Nothing --");
  }
}
1 голос
/ 15 июня 2019

Звучит так, будто вы просто хотите взять slice с размером size из data, если мета-флаг имеет значение true.Вы должны быть в состоянии сделать это, просто зацикливаясь на meta, отслеживая текущую точку в данных:

let data = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10];
let meta = [1, 0, 1];
let size = 4;
let res = [];

for (let i = 0, cur = 0; i < meta.length; i++){
    res.push(data.slice(cur, cur + size * meta[i]))
    cur += size * meta[i]
}
console.log(res)
1 голос
/ 15 июня 2019

Вы можете сделать это в следующих шагах:

  • Создание функции, которая принимает data, meta и size в качестве трех параметров.
  • Создайте пустой массив, который будет результатом.
  • Затем выполните цикл по массиву meta.
  • Затем получить часть массива с начала, равную размеру массива. И push() это в массив результатов.
  • Удалить добавленную часть из исходного массива.
  • При последнем возвращаемом результате

let data = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10];
let meta = [1, 0, 1];
let size = 4;
function parts(data,meta,size){
  let res = [];
  for(let i = 0;i<meta.length;i++){
    res.push(data.slice(0,size * meta[i]));
    data = data.slice(meta[i] * size);
  }
  return res;
}

console.log(parts(data,meta,size))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...