1

現在、2 つの for ループを実行しており、2 つのオブジェクト配列を通過し、両方のリストにあるオブジェクトを含む新しい配列を作成しています。リストが大きくなると、「スクリプトの実行を停止してください」というプロンプトが表示されます。

MineGlobals.receivedData = jQuery.parseJSON(MineGlobals.receivedDataRaw);
MineGlobals.nettStasjonsListe = new Array();

var len1 = MineGlobals.nsData.length;
var len2 = MineGlobals.receivedData.Nettstasjoner.length
for (var i = 0; i < len2; i++) {
        for (var j = 0; j < len1; j++) {
            if (MineGlobals.receivedData.Nettstasjoner[i].Id == MineGlobals.nsData[j].Id) {
                var obj = new nsObject();
                obj = MineGlobals.nsData[j];
                if (MineGlobals.nsData[j].Lg != 0 && MineGlobals.nsData[j].La != 0) {
                    MineGlobals.nettStasjonsListe.push(obj);    
                }
                break;
            }
        }
    }

setTimeout() を試してみましたが、うまくいきません...何かアイデアはありますか?

編集

私は新しいユーザーなので、自分の質問に答えることはできませんが、解決策を見つけることができました。associativeArray() を使用しました。その中に最大の配列を配置し、ID をキーとして、それを反復処理して同一の ID を見つけます。

var associativeArray = {};
for (var i = 0; i < len1; i++) {
    associativeArray[MineGlobals.nsData[i].Id] = MineGlobals.nsData[i];
}

 for (var j = 0; j < len2; j++) {
    var obj = new nsObject();
    obj = associativeArray[MineGlobals.receivedData.Nettstasjoner[j].Id];
    if (obj != undefined) {
        if (obj.Lg != 0 && obj.La != 0) {
            if (obj == null || obj == "") {
                obj.Nvn = "Ikke definert";
            }
            if (obj.NisAdresse == null || obj.NisAdresse == "") {
                obj.NisAdresse = "Ikke definert";
            }
            MineGlobals.nettStasjonsListe.push(obj);
        }
    }
}
4

1 に答える 1

0

chunk配列処理を行うことができます。次のリンクを参照してください。

私はその周りにプロトタイプクラスを書き、これに関する私の問題を解決しました:

/**
 * provides UI update while using large arrays without blocking
 * found core idea on http://www.mattsnider.com/javascript/handle-slow-processes-without-blocking-the-ui/
 */
var ChunkedArray = Class.create(Enumerable, {
    initialize: function(options) {
        this.array = new Array();
        this.options = Object.extend({
            chunkSize: 20,
            interval: 10
        }, options || {})
    },

    push: function(obj) {
        this.array.push(obj)
    },

    chunk: function(array, index, length, iterator, context) {
        var j, l = array.length;
        for (j = (index + length); (index < j && index < l); index += 1) {
            iterator.call(context, array[index], index);
        }

        if (l > index) {
            setTimeout(function() {
                this.chunk(array, index, length, iterator, context);
            }.bind(this), this.options.interval);
        }
    },

    _each: function(iterator, context) {
        this.chunk(this.array, 0,
                this.options.chunkSize, iterator, context);
    },

    toString: function() {
        return this.array.toString();
    }
});
于 2012-06-22T12:33:11.947 に答える