создайте массив массивов из цикла for

#javascript #arrays #for-loop

#javascript #массивы #for-цикл

Вопрос:

Я хочу помещать каждую итерацию в массив, который находится в основном массиве. Вот так: array = [[a,b], [c,d], [e,f]]

метод push и срез, сращивание

 var descendants = [A,C,C,D,C,B], 
chunk = 2, 
descendantPairs = [];
for (var i = 0; i < descendants.length; i  = chunk) {
descendantPairs = descendantPairs.push(descendants.slice(i, i   chunk));
console.log("descendantPairs: "   descendantPairs});
}
  

Прямо сейчас я могу получить пары, подобные этой, но мне нужно сделать больше логики для ВСЕХ пар, а не только для последней пары, поэтому мне нужен массив, который содержит все пары.

Я получаю это сейчас в console.log:

descendantPairs: A,C
descendantPairs: C,D
descendantPairs: C,B

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

1. descendantPairs = descendantPairs.push(descendants.slice(i, i chunk)); ???

2. @MarkMeyer необходимо сохранить порядок потомков, чтобы они были парами, т.Е. array = [ [A,C], [C,D], [D,C]]

3. Не перезаписывайте всю переменную результатом push()

4. Почему вы не используете if (value%2 == 0) (даже)

Ответ №1:

Метод push возвращает длину добавленного элемента, а не массив после нажатия элемента.

заменить descendantPairs = descendantPairs.push(descendants.slice(i, i chunk)); на

 descendantPairs.push(descendants.slice(i, i   chunk));
  

Ответ №2:

Что-то вроде этого поможет:

 let descendants = ['A', 'C', 'C', 'D', 'C', 'B'];
let chunk = 2;
let result = [];

for (let i = 0; i < descendants.length; i  = chunk) {
  result.push(descendants.slice(i, i chunk));
}
console.log(result);  

Ответ №3:

Ваш код содержит одну проблему, вы переназначаете descendantPairs возвращаемое значение Array#push метода, которое будет длиной массива, и это приводит к выдаче ошибки на следующей итерации (поскольку для типа нет метода push Number ).).

Чтобы это заработало, просто удалите часть переназначения и запишите значение после цикла for.

 var descendants = ['A', 'C', 'C', 'D', 'C', 'B'],
  chunk = 2,
  descendantPairs = [];

for (var i = 0; i < descendants.length; i  = chunk) {
  descendantPairs.push(descendants.slice(i, i   chunk));
}

console.log("descendantPairs: ", descendantPairs);  

Ответ №4:

Вы могли бы поместить каждый фрагмент в результирующий массив, не указывая новую длину массива. Следующий цикл выдает ошибку, потому что ваш descendantPairs теперь является числом, а не массивом, который необходим для использования push метода.

 var descendants = ['A', 'C', 'C', 'D', 'C', 'B'],
    chunk = 2,
    result = [],
    i = 0;

while (i < descendants.length) {
    result.push(descendants.slice(i, i  = chunk));
}
console.log(result);  

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

1. Можете ли вы объяснить, чем это отличается от того, что делала OP, поскольку она помещала каждый фрагмент в результирующий массив?

2. он не присваивает результат нажатия (новую длину массива) результирующему набору.

Ответ №5:

Вы можете использовать простой цикл for и temp переменную и передавать значения для каждого второго индекса в конечный результат

 var arr = [`A`,`C`,`C`,`D`,`C`,`B`]
let op = []
let temp = []

for(let i = 0; i < arr.length; i  ){
  temp.push(arr[i])
  if( i % 2 == 1 ){
    op.push(temp)
    temp = []
  }
}
if( temp.length > 0 ){
  op.push(temp)
}

console.log(op)  

Ответ №6:

 var arr = ['A','C','C','D','C','B'];
let chunk = 2;
let pairs = [];

for(let i = 0; i < arr.length; i = chunk) {
    pairs.push(arr.slice(i, i   chunk));
}
console.log(pairs);  

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

1. Действительно стоит это протестировать. Имеет серьезные недостатки

2. Есть встроенный редактор кода, который позволяет запускать ваш код, если вы нажмете на <> при редактировании ответа