2016-08-27 26 views
2

我有兩個數組是這樣的:兩個數組中的Javascript的毗連價值

const a = ['a', 'b', 'c', 'd']; 
const b = ['1', '2', '3', '4']; 

我試圖做一個新的數組是這樣的:

const c = ['a1', 'b2', 'c3', 'd4']; 

我試着這樣說:

const c = []; 
c.push([`${a[0]}${b[0]}`, `${a[1]}${b[1]}`, `${a[2]}${b[2]}`, `${a[3]}${b[3]}`]); 

實際上循環數據,這樣做了17400毫秒。我拿出c.push([........]);,它下降到1250ms。

爲什麼這需要很長時間?

什麼是最好的方法來做到這一點?

+1

17400ms 4個元素? – undefined

+0

它通過Object.keys(obj).map()來查看,而obj具有〜20k個鍵。 – cocacrave

+0

看來你正在做很多'push',我會預先分配。而且我會避免使用模板字符串,在這裏它們根本沒有用處,並且也不會讓我感到驚訝,因爲這些字符串最近使用得較少,而且使用頻率也較低。 – Oriol

回答

2

您可以使用.map來實現。地圖const a,然後在每個循環中使用索引來獲取b的元素。

const a = ['a', 'b', 'c', 'd']; 
const b = ['1', '2', '3', '4']; 

var c = a.map(function (d, i) { 
    return d + String(b[i]) 
}) 

console.log(c) 
// ["a1", "b2", "c3", "d4"] 

吸塵器代碼使用ES6:

var c = a.map((d, i) => `${d}${b[i]}`) 
+0

如果它們是整數? –

+1

不需要使用'String'。「b」的值已經是字符串,如果它們是數字,它們將與來自'a'的字符串連接時被強制爲字符串。 – Oriol

+0

謝謝,我試過了,但問題出在Array.push()。我不知道該怎麼做...你能幫忙嗎? – cocacrave

1

一個簡單的循環。

const a = ['a', 'b', 'c', 'd', 'e']; 
 
const b = ['1', '2', '3']; 
 
var result = []; 
 

 
for (var i = 0; i < a.length; i++) { 
 
    result[i] = a[i] + b[i]; 
 
} 
 

 
alert(result);

1

正如我懷疑你證實,真正的問題是,你做太多的push

push修改數組的長度。該規範沒有強制實現數組的任何數據結構,但對於非稀疏實例,實現通常使用將值連續存儲在內存中的列表。當您更改數組的長度時,這是有問題的,因爲附加數據無法放入當前數據所在的內存中,所以必須移動所有數據。 push最終以攤銷時間而不是僅僅不變。

但是,如果事先知道結果數組的長度,通常更好的是預分配。

然後,而不是

var array = []; 
for(var i=0; i<2e4; ++i) 
    array.push([a[0]+b[0], a[1]+b[1], a[2]+b[2], a[3]+b[3]]); 

我會用

var array = new Array(2e4); 
for(var i=0; i<2e4; ++i) 
    array[i] = [a[0]+b[0], a[1]+b[1], a[2]+b[2], a[3]+b[3]]; 
+0

有趣..我從來不知道你可以預先分配這樣的記憶。我會嘗試一下並讓你知道。 – cocacrave