2014-10-25 2 views
1

У меня есть два массива A и B, оба из которых содержат много elemets и выглядят следующим образом:Объединение двух массивов чередованием в Jquery

var A = ["A", "B", "C", "D"]; 
var B = [1, 2, 3, 4]; 

Теперь я хочу массив C что «сливает» A и B путем конкатенации их чередованием так, что

C = ["A", 1, "B", 2, "C", 3, "D", 4] 

Я попытался это:

for (var i = 0; p < 3; i++) { 
    C = A[i].concat(B[i]) 
} 

Но это приводит к C = "D4".

Как добиться того, чтобы я объединил два массива, поочередно выбрав один элемент каждого массива?

+0

Я сделал JSPerf для сравнения возможных решений: http://jsperf.com/merge-two-arrays-in-alternating-sequence – Oriol

+0

Это является удивительным. Спасибо за ваши усилия и время с этим! –

ответ

1
var l = A.length + B.length, 
    C = Array(l); 
for(var i=0; i<l; ++i) 
    C[i] = (i%2 ? B : A)[i/2|0]; 

В основном, он заполняет C с предметами из A или B в зависимости от того, если i четным или нечетным.

Примечание Я использовал i/2|0 в качестве ярлыка, но он будет работать только я l строго меньше 2 . Если вы хотите быть в безопасности, используйте Math.floor(i/2).

2

Вы можете использовать reduce и concat вместе для этого:

var A = ["A", "B", "C", "D"]; 
 
var B = [1, 2, 3, 4]; 
 

 
var result = A.reduce(function(prev, curr) { 
 
    return prev.concat(curr, B[prev.length/2]); 
 
}, []); 
 

 
alert(result);

Или просто for или forEach цикл:

var result = []; 
A.forEach(function(el, i) { 
    result.push(el, B[i]); 
}); 

будет производить тот же результат.

2
var C = []; 
for (var i = 0; p < 3; i++) { 
    C.push(A[i]); 
    C.push(B[i]); 
} 
Смежные вопросы