3

我不是 JavaScript 的老手,我有一个小问题:

在 AngularJS 控制器中,我从表单的 WebService 获得 2 个数组[{"id":"1", "name":"aname1"}, {"id":"2", "name":"aname2"}]。它们具有相同的结构(这应该不重要)。

with concat()orpush()我无法将这些数组合并在一起,我不明白为什么。

我试过了

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 的元素,结果相同。

没有任何效果。为什么?

4

4 回答 4

5

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]
于 2013-11-04T10:02:48.847 回答
2

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

var result = array1.concat(array2);

.concat()方法返回一个包含连接元素的新数组。

MDN 文档Array.prototype.concat

于 2013-11-04T10:03:24.600 回答
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);

这种疯狂的猜测只是来自这种错误在初学者代码中的频率。

于 2013-11-04T11:02:57.860 回答
1

用这个

var newArray= array1.concat(array2);
于 2013-11-04T10:04:16.297 回答