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

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

метод push и slice, splice

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.info("descendantPairs: " + descendantPairs});
}

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

Теперь я получаю это в console.info:

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

descendantPairs = descendantPairs.push(descendants.slice(i, i + chunk)); ???
Pranav C Balan 07.04.2019 19:04

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

artworkjpm 07.04.2019 19:06

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

charlietfl 07.04.2019 19:08

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

BOZ 07.04.2019 19:15
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
1
4
593
6
Перейти к ответу Данный вопрос помечен как решенный

Ответы 6

Вы можете поместить каждый фрагмент в массив результатов, не назначая новую длину массива. Следующий цикл выдает ошибку, потому что ваш 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.info(result);

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

Scott Hunter 07.04.2019 19:07

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

Nina Scholz 07.04.2019 19:16

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.info(pairs);

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

charlietfl 07.04.2019 19:13

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

charlietfl 07.04.2019 19:17

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

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

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

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

Чтобы заставить его работать, просто удалите часть переназначения и запишите значение после цикла 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.info("descendantPairs: ", descendantPairs);
Ответ принят как подходящий

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

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.info(result);

Вы можете использовать простой цикл 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.info(op)

Другие вопросы по теме