JavaScript: 无法合并两个数组

3
我不是JavaScript的老手,我有一个小问题:
在AngularJS控制器中,我从Web服务获取两个数组,形式为[{"id":"1", "name":"aname1"}, {"id":"2", "name":"aname2"}]。它们都具有相同的结构(这应该不重要)。
使用concat()或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循环之外显示它,则显示[],而arrayS和arrayAE则显示它们的内容)。
同样的逻辑也适用于:
array1.push.apply(array1, array2);

我尝试在for循环中逐个推入array2的元素,但结果相同。
什么都没用。为什么?

请提供您尝试过的代码。 - Deepak Ingole
array1.push.apply(array1, array2); 对我来说是有效的。concat 也可以使用,但它会返回一个新数组:array1 = array1.concat(array2); - Kobi
1
你真的认为 concat 或者 push 不起作用吗?请说明问题所在,附上代码片段...肯定你的问题出在其他地方。 - 6502
你为什么将它标记为AngularJS问题? - Adrian Salazar
@Pierre:当你说“什么都没用”时,实际上发生了什么?你尝试的代码得到了什么结果,你期望得到什么结果? - Paul D. Waite
4个回答

6

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

2

你是否将结果分配给另一个变量?例如:

var result = array1.concat(array2);
.concat() 方法返回一个新的数组,其中包含连接后的元素。 MDN关于Array.prototype.concat的文档

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);

这个疯狂的猜测只是基于这种错误在初学者代码中出现的频率。

这似乎是原因。对于静态分配的数组,concat和push工作正常。您对我的问题有什么解决方案建议吗? - Pierre-Yves Le Dévéhat
@Pierre-YvesLeDévéhat:请查看编辑部分,了解用于Ajax的异步逻辑的简单解释。 - 6502

1
使用此


var newArray= array1.concat(array2);

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接