Получить 1 элемент из каждого массива javascript concat, затем зациклить в одном массиве

1

У меня 4 массива, я хотел бы объединить их в 1. Я могу это сделать, но я хотел бы взять один элемент из каждого массива, подтолкнуть его к новому массиву, а затем получить следующие 4 и так далее. Это то, что я получил:

var a = [ "foo", "bar", "baz", "bam", "bun", "fun" ];
var b = [ 1, 2, 3, 4, 5, 6];
var c=["a","b","c","d","e","f"];
var d=[7,8,9,10,11,12]
var neat=[];
neat= a.concat(b, c,d);
//neat=["foo","bar","baz","bam","bun","fun",1,2,3,4,5,6,"a","b","c","d","e","f",7,8,9,10,11, 12]

Результат, который я хочу, будет примерно таким:

//neat=["foo",1,"a",7,"bar",2,"b",8...]

Я не уверен, будет ли цикл работать, или если мне нужно использовать другую функцию

  • 0
    Это всегда 4 массива? Длина всегда одинакова? Это те вопросы, на которые нужно ответить, прежде чем найти решение.
Теги:
arrays
loops

4 ответа

1
Лучший ответ

Пожалуйста, попробуйте приведенный ниже код:

var a = [ "foo", "bar", "baz", "bam", "bun", "fun" ];
var b = [ 1, 2, 3, 4, 5, 6];
var c=["a","b","c","d","e","f"];
var d=[7,8,9,10,11,12]
var neat=[];
//neat= a.concat(b, c,d);
//neat=["foo","bar","baz","b



for (var i = 0; i < a.length ; i++) 
{
neat.push(a[i], b[i], c[i], d[i]);
}
console.log(neat);
  • 0
    Считаете ли вы, что ваше решение лучше, чем Джастин?
  • 0
    Что касается сложности времени, они оба работают в O (n).
Показать ещё 2 комментария
2

Предполагая, что каждый массив источников имеет одинаковую длину:

a.forEach((e, i) => {
  neat.push(e, b[i], c[i], d[i]);
};
  • 0
    они одинаковой длины для моего случая
1

Хотя ответ Justins правильный, однако, если длины массива не одинаковы каждый раз, вы можете сделать

var maxItems = Math.max(a.length,b.length,c.length,d.length);

var neat = [];

for(var i = 0; i < maxItems; i++){

  if(a[i] != undefined){
    neat.push(a[i]);
  }

  if(b[i] != undefined){
    neat.push(b[i]);
  }

  if(c[i] != undefined){
    neat.push(c[i]);
  }

  if(d[i] != undefined){
    neat.push(d[i]);
  }
}

Math.max найдет наибольшее количество записей из между 4 массивов, то простой for loop по этому номеру и проверьте, если значение undefined, прежде чем толкая его neat array.

См. JSFiddle

  • 0
    На самом деле вы должны использовать a.length >= i , потому что a[i] != undefined вернет false как для null и для undefined индексов. Кроме того, уменьшение 1 от maxItems в условии цикла не является необходимым и пропустит последний элемент самого большого массива.
  • 0
    @ Taurus Ну, вам не нужны null и undefined значения, скорее всего, учитывая, что наборы данных являются integers и strings . Индексы в массивах начинаются с 0 , необходимо убрать 1, иначе вы в конечном итоге будете выполнять последнюю итерацию для значений индекса, таких как undefined значения, так как Math.max будет возвращать количество элементов в массиве. Скажем, есть 6 элементов, maxItems = 6 , максимальный индекс в массиве равен 5, поэтому последняя итерация избыточна.
Показать ещё 2 комментария
-1

Потому что длина всех массивов равна. Поэтому мы можем легко сделать это с помощью цикла.

var a = [ "foo", "bar", "baz", "bam", "bun", "fun" ];
var b = [ 1, 2, 3, 4, 5, 6];
var c=["a","b","c","d","e","f"];
var d=[7,8,9,10,11,12]
var neat=[], i;

for(i=0;i<a.length;i++){
    neat.push(a[i]);
    neat.push(b[i]);
    neat.push(c[i]);
    neat.push(d[i]);
}
console.log(neat);
  • 1
    Вы знаете, что можете добавить серию элементов, используя только один .push ? Посмотрите другие ответы ниже, которые совпадают с вашими, и покажите эту функцию.
  • 0
    Действительно, ваш ответ такой же, как и другие ответы здесь.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню