2013-11-04 69 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);