0

私は 2 つの配列を比較する標準的な方法を使用していますが、標準的な O(n^2) を実行するのと同じくらい遅いです。問題がわかりますか?

    diffArray: function (arr1, arr2, observableArray, mapping) {
        //We cant sort orginal arrays
        var o = arr1.slice(0);
        var n = arr2.slice(0);

        // sort both arrays (or this won't work)
        var sorter = function (left, right) {
            return mapping.key(left) - mapping.key(right);
        };
        o.sort(sorter); n.sort(sorter);

        // declare temporary variables
        var op = 0; var np = 0;
        var added = []; var removed = [];

        // compare arrays and add to add or remove lists
        while (op < o.length && np < n.length) {
            if (mapping.key(o[op]) < mapping.key(n[np])) {
                // push to diff?
                removed.push(o[op]);
                op++;
            }
            else if (mapping.key(o[op]) > mapping.key(n[np])) {
                // push to diff?
                added.push(n[np]);
                np++;
            }
            else {
                this.diffMembers(o[op], n[np]);
                op++; np++;
            }
        }

        // add remaining items
        if (np < n.length)
            added = added.concat(n.slice(np, n.length));
        if (op < o.length)
            removed = removed.concat(o.slice(op, o.length));

        ko.utils.arrayForEach(removed, function (item) {
            this.itemDeleted(item, mapping);
        }.bind(this));


        ko.utils.arrayForEach(added, function (item) {
            if (observableArray.concurrencyExtendOptions) {
                this.itemAdded(observableArray, item, mapping);
            }
        } .bind(this));
    }

注: マッピング オブジェクトは、ユーザーが配列内のオブジェクトを比較するために提供する単なるヘルパー オブジェクトです。arr1 と arr2 は標準の JS 配列であり、observableArray はラップされていない Knockout 配列です。

これは C# コードの例に基づいているので、JS のソート アルゴリズムはあまり良くないのでしょうか?

4

1 に答える 1

1

本当に答えられるかどうかはわかりませんが、diff配列に使用しているのは次のとおりです。

Array.prototype.diff = function( arr ) {
    return arr.map( function( v ) {
        if ( !~this.indexOf( v ) ) return v;
    }, this ).filter( Boolean );
};

使用法:

arr.diff( otherArr );

PS:コメントとして投稿するには長すぎます...答えに値するかどうかはわかりません。
PS2: 関数の元の作成者: @Esailja

于 2012-06-19T08:37:27.630 に答える