3

私は JavaScript のベテランではなく、少し問題があります。

AngularJS コントローラーでは、フォームの WebService から 2 つの配列を取得します[{"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の要素を1つずつプッシュしようとしましたが、同じ結果になりました。

何も機能しませんでした。なんで?

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

2 つの非同期クエリの結果を連結する必要がある場合は、それらを連鎖させる (最初のクエリが返されたときにのみ 2 番目のクエリを作成する) か、2 番目のクエリが完了するまで待機する必要があります。

// 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 に答える