2016-03-03 41 views
3

我相信陣列可以被加入,然後放入一個字符串使用自定義分隔符是這樣的:加入兩個數組的成員由順序

var a1 = ["apple","orange"]; 
var a2 = ["hot", "cold"]; 
var a3 = a1.concat(a2); 
var str = a3.join("_"); 

然而,其結果必然是:

apple_orange_hot_cold 

我期待着加入a1的每個成員與相應的a2成員,其中通過數組中的順序發生。假設a1中的成員數總是等於a2中的數。所以,我想輸出是一個字符串,看起來像這樣:

apple_hot_orange_cold 

什麼是最好的方式來實現這一目標?

+0

這兩個數組的總是有相同數量的元素嗎? – Archer

+1

@Archer「假設a1中的成員數總是等於a2中的數」 –

+0

Lol。咄!謝謝:) – Archer

回答

2

結合您的陣列,reduce功能,而不是concat

var a1 = ["apple","orange"]; 
var a2 = ["hot", "cold"]; 

var str = a1.reduce(function(r, v, i) { 
    r.push(v, a2[i]); 
    return r; 
},[]).join('_'); 

解決方案與ES6語法:

let str = a1.reduce((r, v, i) => [...r, v, a2[i]], []).join('_'); 

或替代解決方案與map

let str = a1.map((v, i) => `${v}_${a2[i]}`).join('_'); 
0

你可以用一個簡單的循環for做到這一點:

var a1 = ["apple","orange"], 
 
    a2 = ["hot", "cold"], 
 
    str = ""; 
 

 
for (var i = 0; i < a1.length; i++) 
 
    str += (i === 0 ? "" : "_") + a1[i] + "_" + a2[i] 
 

 
alert(str);

(i === 0 ? "" : "_")部分簡單地檢查,如果我們在第一次循環;如果我們是這樣,這不會在前面增加任何內容,否則會增加一個額外的下劃線。

1

我會遍歷所有項目和結合ne如果有項目,則使用w數組。

該解決方案適用於相等和不相等的陣列長度。

var a1 = ["apple", "orange", 'ddd'], 
 
    a2 = ["hot", "cold"], 
 
    result = function (a1, a2) { 
 
     var l = Math.max(a1.length, a2.length), 
 
      i, 
 
      r = []; 
 
     for (i = 0; i < l; i++) { 
 
      i in a1 && r.push(a1[i]); 
 
      i in a2 && r.push(a2[i]); 
 
     } 
 
     return r;    
 
    }(a1, a2); 
 

 
document.write(result.join('_'));

+0

我將使用Math.min來避免在數組 – profesor79

+1

以外的調用是的,如果不等的部分應該被丟棄,但是我在a1 && r.push(a1 [i])中用'i檢查項目;'並據此推。 –

0

另一種選擇:

var a1 = ["apple","orange"]; 
 
var a2 = ["hot", "cold"]; 
 
var a3 = []; 
 

 
a1.forEach(function(a, i) { 
 
    [a, a2[i]].forEach(function(b) { 
 
    a3.push(b); 
 
    }); 
 
}); 
 

 
alert(a3.join('_'));

或用ES6語法,你可以做到這一點作爲一個超級乾淨的一行:

var a1 = ["apple","orange"]; 
 
var a2 = ["hot", "cold"]; 
 
var a3 = []; 
 

 
a1.forEach((a, i) => [a, a2[i]].forEach((b) => a3.push(b))); 
 

 
alert(a3.join('_'));

相關問題