Потеря данных из массива

#javascript #arrays

Вопрос:

Я вырезаю 3 элемента из массива и сохраняю их в другом массиве

 array = [1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1];
rows = 3;
 

Вот мой метод

 getVertWallStruct = (array, rows) => {
    let i = 1,
        storageArr = [],
        data = [];

    for (let k = 0; k < rows*2; k  ) { // everything's ok here
      storageArr.push(array.slice(k*rows, (k 1)*rows));
    }

    data = storageArr;

    console.log("storageArr - ", storageArr, " , array - ", array, " , data - ", data);

    return data;
  }
 

В этом случае storageArr будет состоять из пустых массивов (насколько это касается данных). Но когда я удаляю строку с данными = storageArr; Я получаю:

 storageArr =  [ //storageArr should look like this in the end
  [1, 1, 1],
  [0, 1, 1],
  [1, 1, 1],
  [1, 1, 1],
  [0, 1, 1],
  [1, 1, 1]
]
 

Почему я теряю ценности?

Обновление: Даже когда я копирую вставленный код из одного из ответов-метод возвращает пустые данные. Почему?

Код выглядит так:

 getVertWallStruct = (array, rows) => {
    console.log(array, rows); //okay here
   
    let iterator = array.values()
    let out = []
    for (let i = 0;i < ~~(array.length / rows); i  ){
      out.push([iterator.next().value, iterator.next().value, iterator.next().value])
    }
    console.log(out); //empty ???
    
    return out;
  }
 

введите описание изображения здесь

Комментарии:

1. arr = array здесь это довольно бессмысленно. Просто переименуйте аргумент. Точно так же и есть data = storageArr . Просто return storageArr напрямую.

2. Помните, что в JavaScript x = y для объектов не копируется объект , это означает, что x и y ссылаются на один и тот же объект .

3. Почему k < rows*2 , когда вы группируете их по 3 штуки? Должно ли это быть k < rows * 3 так ? Или вы собираетесь использовать пары, но получаете тройню?

4. Он пуст, потому что вы никогда не касаетесь его напрямую, вы объявляете его пустым массивом, затем выбрасываете этот пустой массив и делаете его псевдонимом storageArr . Можете ли вы объяснить, что делает код в его текущем виде и насколько это неверно? Непонятно, что вы подразумеваете под «утратой ценностей».

5. @LirysJH чего именно вы пытаетесь достичь?

Ответ №1:

Возможный способ сделать это, используя итератор массива:

Метод values() возвращает новый объект итератора массива, содержащий значения для каждого индекса в массиве. https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_objects/Object/values

 const array = [1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1]
let iterator = array.values()
let out = []
for (let i = 0;i < ~~(array.length / 3);i  ){
  out.push([iterator.next().value, iterator.next().value, iterator.next().value])
}
console.log(out) 

Обновление, похоже, это работает нормально:

Обновление: Даже когда я копирую вставленный код из одного из ответов-метод возвращает пустые данные. Почему?

 getVertWallStruct = (array, rows) => {
    let iterator = array.values()
    let out = []
    for (let i = 0;i < ~~(array.length / rows); i  ){
      out.push([iterator.next().value, iterator.next().value, iterator.next().value])
    }
    return out;
  };

console.log(
  getVertWallStruct([1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1], 3)
) 

Комментарии:

1. Почему i <= ~~((array.length / 3) - 1 , а не это i < ~~((array.length / 3) ?

2. Вы правы, я использовал <= , исправил для упрощения, спасибо.

3. Проблема все еще возникает. Метод возвращает пустые данные

Ответ №2:

Используйте сокращение, вставляйте пустой массив в накопитель каждый раз, когда индекс делится на количество строк. Вставьте текущий элемент в последний массив в накопителе.

 const array = [1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1];

const rowify = (array, rows) => array.reduce((results, current, index) => {
  if (index % rows === 0) {
    results.push([]);
  }
  results[results.length - 1].push(current);
  return results;
}, []);

console.log(rowify(array, 3));