#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));