0

JavaScriptで多次元配列を並べ替える方法

        how to sort this multi dimensional array in javascript

            var arr = [];
            arr[0]  = [{id:1}, {id:5}, {id:7}];
            arr[1] =  [{id:3}, {id:8}, {id:6}];
            arr[2] = [{id:2}, {id:4}, {id:9}];


            The output should be like this
            arr[0]  = [{id:1}, {id:2}, {id:3}];
            arr[1] =  [{id:4}, {id:5}, {id:6}];
            arr[2] = [{id:7}, {id:8}, {id:9}];
4

3 に答える 3

2

いくつかのヘルパー関数が必要になります。

Array.prototype.flattened = function() {
    return Array.prototype.concat.apply([], this);
};
Array.prototype.splitBy = function(n) {
    var r = [];
    for (var i=0; i<this.length; i+=n)
        r.push(this.slice(i, i+n));
    return r;
};
Array.prototype.sortBy = function sortBy(key) {  
if (this[0] && this[0][key] == "number")
        return this.sort(function(a,b) {return a[key] - b[key];});
    return this.sort(function(a, b) {
        return a[key]<b[key] ? -1 : a[key]>b[key] ? 1 : 0;
    });
};

次に、それは簡単です:

arr.flattened().sortBy("id").splitBy(3);

jsfiddle.netでのデモ

于 2012-10-10T09:27:34.640 に答える
1

私が考えることができる最も簡単な解決策はこれです

var sortChunks = function(ar, property,chunkSize)
{
    //set default params:
    chunkSize = chunkSize || ar[0].length;// || 3?;
    property = property || 'id';
    var i=0,j=0,all = [],ret = [];
    for(i=0;i<ar.length;i++)
    {//"map" objects, use property as array index
        for(j=0;j<ar[i].length;j++)
        {
            all[ar[i][j][property]] = ar[i][j];
        }
    }
    all.sort(function(a,b)
    {//move all undefined keys to the end of the array
        if (a === undefined)
            return 1;
        if (b === undefined || b.id > a.id)
            return -1;
        else
            return 1;
    });
    while(all && all[0] !== undefined)
    {//make chunks
       ret.push(all.splice(0,chunkSize));
    }
    return ret;
};
//usage:
arr = sortChunks(arr);//returns desired array
//or
arr = sortChunks(arr,'id',3);

そうは言っても、このかなり肉厚な(そして現在の形式ではエラーが発生しやすい)ソート関数に依存するよりも、この配列の構築方法を再考し、そのコードを変更する方がおそらく良いでしょう。

その間、このフィドルをチェックして、実際に動作していることを確認してください...

于 2012-10-10T09:14:49.917 に答える
0

n * m 要素の「1 次元」配列を作成できます。ここで、n と m は行と列の数です。次に、ソート アルゴリズムの 1 つを使用します。

http://en.wikipedia.org/wiki/Sorting_algorithm

于 2012-10-10T08:09:53.977 に答える