2010-10-26 4 views
3

Я следующие динамически генерируемые строки:Javascript объединить массивы или строки

var stringA = ["a1", "a2", "a3" ... 'a400' ... 'a600']; // length 600 
var stringB = ["b1", "b2", "b3" ... 'b400']; // length 400 

Как я могу получить массив или строку, как в сочетании, как это:

var myString = ["a1b1", "a2b2", "a3b3" ... "a400b400", "a401" ... "a600"] 

ответ

3

Вы можете сделать что-то вроде этого:

var result = [], len = Math.max(stringA.length, stringB.length); 
for(var i=0; i < len; i++) { 
    result.push((stringA[i] || "") + (stringB[i] || "")); 
} 

You can test it out here, то || "", чтобы предотвратить получение undefined в виде строки на для массива, который короче. Вызов Math.max() должен разрешить либоA, либо B, чтобы быть длиннее, он будет проходить до конца либо так же, как A в вопросе.

+0

Я удалил свой ответ, потому что забыл, что я * должен * использовать 'Math.max()', чтобы избежать повторения меньшего массива. Так +1 к тебе Ник! – alex

+0

Thanx Nick! Ты помог мне снова! – Mircea

+0

Это приведет к записям в целевом массиве в индексах, где в исходном массиве нет записей (если есть такие записи). –

0

Я не думаю, что там все, что встроено в объект Array, который сделает это за вас, вам нужно будет сделать цикл. Цикл тривиально, хотя:

var index, length; 
var result = []; 
// assertion: arrayA.length === arrayB.length 
result.length = arrayA.length; // Helps performance in some implemenations, harmless in others 
for (index = 0, length = arrayA.length; index < length; ++index) { 
    result[index] = arrayA[index] + arrayB[index]; 
} 

(я переименовал stringA ->arrayA и stringB ->arrayB, чтобы избежать путаницы.)

Если массивы разной длины или некоторых из записей в массивах не определены (что вполне возможно, JavaScript массивы немногочисленны), вы хотите, чтобы справиться с этим в цикле, например:

var index, length, Apresent, Bpresent; 
var result = []; 
result.length = Math.max(arrayA.length, arrayB.length); // Helps performance in some implementations, harmless in others 
for (index = 0, length = result.length; index < length; ++index) { 
    Apresent = arrayA.hasOwnProperty(index); 
    Bpresent = arrayB.hasOwnProperty(index); 
    if (Apresent && Bpresent) { 
     result[index] = arrayA[index] + arrayB[index]; 
    } 
    else if (Apresent) { 
     result[index] = arrayA[index]; 
    } 
    else if (Bpresent) { 
     result[index] = arrayB[index]; 
    } 
} 

Если аг лучи редки, и оба они оказываются разреженными по одному и тому же индексу, результирующий массив также будет скудным.

+0

Это также приведет к большому 'undefined' когда длина массива действительно отличается, так как они делают в этом вопросе :) –

+0

@Nick: Спасибо. Первоначально не было ясно из вопроса, что массивы могут иметь разную длину (он показал их как одну длину), но я вижу, что вы подразумеваете под его результатом (тонким, это). Я видел ваш другой комментарий и обновлялся, как вы прокомментировали здесь. :-) Я вижу, что кто-то задал ему вопрос. –

-1
var myString = []; 

for (var i=0;i<stringA.length;i++){ 
    myString[i] = stringA[i] + stringB[i]; 
} 
+0

Это не сработает, вы получите '' undefined ''во многих местах, когда длины массива будут отличаться, как и в вопросе. –

0

Если вам не нужно сохранять элементы в исходных 2 массивах, то код ниже работает очень хорошо. Он не имеет предопределенного предела количества итераций в цикле for, что означает, что массив stringA и StringB может продолжать расти в размере, пока этот код работает.

var myString = []; 
for(var answer; answer = (stringA.shift() || "") + (stringB.shift() || "");) { 
    myString.push(answer); 
} 
Смежные вопросы