2013-11-04 107 views
3

我不是JavaScript的一個老兵,我有一個小問題:的JavaScript:無法合併兩個數組

在AngularJS控制器,我得到2個陣列從形式[{"id":"1", "name":"aname1"}, {"id":"2", "name":"aname2"}]的一個WebService。他們有相同的結構(這應該不重要)。

With concat() or push()我無法將這些數組合並在一起,我不明白爲什麼。

我試圖

var arrayS = Service.list();   // Get data from WebService 
var arrayAE = ActeurExterne.list(); // Idem 
var arrayRes = arrayS.concat(arrayAE); 
$scope.acteurs = arrayRes; 

以我AngularJS應用,陣列acteurs爲空(如果我其顯示在ng-repeat循環外,它顯示[]而陣列和arrayAE顯示其內容)

而相同的邏輯與:

array1.push.apply(array1, array2); 

我試圖推動array2的元素一個接一個在for循環,相同resul噸。

毫無效果。爲什麼?

+0

請提供代碼你試過 –

+0

'array1.push.apply(array1,array2);'正在爲我工​​作。 'concat'也可以工作,不過它會返回一個新的數組:array1 = array1.concat(array2);'。 – Kobi

+1

你真的**認爲'concat'或'push'不起作用嗎?請說明代碼片段有什麼問題...確定您的問題在其他地方。 – 6502

回答

2

你實際上是在正確的合併陣列和這兩種方法將工作(只要喜歡別人說你使用的concat的返回值),但結果是空的,因爲你這樣做的時候從Ajax請求的答案還不到和陣列仍然是空的。

當使Ajax請求必須操作成功的回調函數裏面的結果,而不是在Ajax請求的代碼相同的水平;例如

var myvec = []; 
$.getjson(request_url, function(data) { 
    myvec = data; 
}); 
process(myvec); 

就不行,因爲它試圖利用myvec內容權的請求已提交後,但答覆的到來之前。正確的代碼來代替:

$.getjson(request_url, function(data) { 
    // This code is executed when the data arrives from the server 
    process(data); 
}); 

如果需要連接兩個異步查詢的結果,你必須要麼把它們連(使第二查詢一次返回的第一個),或者你必須等待第二個完成:

// First solution, simple but slower (waits for first reply 
// before making second request) 
$.getjson(request_url_1, function(data_1) { 
    $.getjson(request_url_2, function(data_2) { 
     process(data_1.concat(data_2)); 
    }); 
}); 

// Second solution; starts both requests and waits for both 
// of them to complete before doing the processing 

var count = 0; 
var res = []; 
function handle_data(data) { 
    res = res.concat(data); 
    count += 1; 
    if (count == 2) { 
     process(res); 
    } 
} 

$.get(request_url_1, handle_data); 
$.get(request_url_2, handle_data); 

這個瘋狂的猜測是簡單地從這種錯誤在初學代碼的頻率來。

+0

這似乎是原因。對於靜態分配的數組,concat和push工作正常。你對我的問題提出什麼解決方案? –

+0

@ Pierre-YvesLeDévéhat:請參閱編輯以獲取有關ajax所需的異步邏輯的簡單說明。 – 6502

5

concat()會返回一個新的數組,不Concat的到this。因此:

var a=[1,2,3]; 
var b=[4,5,6]; 
var c=a.concat(b); 
// a is still [1,2,3] 
// c is [1,2,3,4,5,6] 
+1

我懷疑這是真正的問題:OP說「我嘗試在for循環中逐個推送array2的元素,結果相同」。我認爲這個問題缺少真正的問題... – Kobi

1

使用此

var newArray= array1.concat(array2);