11

以下で定義されているプロパティの 1 つに基づいて、オブジェクトの配列を並べ替える優れた方法を見つけました。

JavaScript の文字列プロパティ値でオブジェクトの配列を並べ替える

この関数を使用すると、(すべてのブラウザーで) 単一の並べ替えに完全に機能し、Google Chrome を使用する場合を除いて、別の並べ替え内の並べ替えにも完全に機能します! これは、オブジェクトの配列に対する Ege Özcan の優れたソート ルーチンです。

function dynamicSort(property) { 
    return function (a,b) {
        return (a[property] < b[property]) ? -1 : (a[property] > b[property]) ? 1 : 0;
    }
}

「Data」という名前の配列を使用します (もちろん、私の配列にはさらに多くのオブジェクトのペアがあります)...

var Data = [{Category: "Business", Value: "ABC"},{Category:"Personal", Value:"XYZ"}];

これを行うことで、各カテゴリ内のすべての値として順序がリストされている適切な並べ替えを取得できます...

Data.sort(dynamicSort("Value"));
Data.sort(dynamicSort("Category"));

最初に で並べ替えValue、次に で並べ替えることによりCategory、配列はすべての値を並べ替えた順序で配置し、すべてのビジネス ベースの値を最初にリストし、次にすべての個人ベースの値をリストします。完全!データがカテゴリ別に適切にソートされている Chrome を除きますが、各カテゴリ内の値の順序はかなりランダムに見えます。

Chromeでも機能するソート内でソートを行うより良い方法を知っている人はいますか?

4

5 に答える 5

41

そのdynamicSort関数のマルチパラメーターバージョンを作成しました。

function dynamicSort(property) { 
    return function (obj1,obj2) {
        return obj1[property] > obj2[property] ? 1
            : obj1[property] < obj2[property] ? -1 : 0;
    }
}

function dynamicSortMultiple() {
    /*
     * save the arguments object as it will be overwritten
     * note that arguments object is an array-like object
     * consisting of the names of the properties to sort by
     */
    var props = arguments;
    return function (obj1, obj2) {
        var i = 0, result = 0, numberOfProperties = props.length;
        /* try getting a different result from 0 (equal)
         * as long as we have extra properties to compare
         */
        while(result === 0 && i < numberOfProperties) {
            result = dynamicSort(props[i])(obj1, obj2);
            i++;
        }
        return result;
    }
}

次のように配列を作成しました。

var arr = [
    {a:"a",b:"a",c:"a"},
    {a:"b",b:"a",c:"b"},
    {a:"b",b:"a",c:"a"},
    {a:"b",b:"a",c:"b"},
    {a:"b",b:"b",c:"a"},
    {a:"b",b:"b",c:"b"},
    {a:"b",b:"b",c:"a"},
    {a:"b",b:"b",c:"b"},
    {a:"b",b:"b",c:"a"},
    {a:"b",b:"b",c:"b"},
    {a:"b",b:"b",c:"a"},
    {a:"c",b:"b",c:"b"},
    {a:"c",b:"c",c:"a"}
];

そしてそれは私がしたときにうまくいきました、

arr.sort(dynamicSortMultiple("c","b","a"));

そして、これが実際の例です:http: //jsfiddle.net/ZXedp/

于 2012-07-08T00:32:46.527 に答える
8

Javascript Multi-Criteria Sort (または Multi-Parameter Sort) を実行する最も簡単な方法は、 を使用し.sort、複数のパラメーターを連結して、2 つの文字列を比較することです。

例えば:

data.sort(function (a, b) {

  var aConcat = a["property1"] + a["property2"];
  var bConcat = b["property1"] + b["property2"];

  if (aConcat > bConcat) {
    return 1;
  } else if (aConcat < bConcat) {
    return -1;
  } else {
    return 0;
  }

});

ここに JsFiddle スクリプトを含めました: http://jsfiddle.net/oahxg4u3/6/

于 2014-12-19T01:03:26.747 に答える
2

thenBy.js も参照してください: https://github.com/Teun/thenBy.js

標準の Array.sort を使用できますが、firstBy().thenBy().thenBy() スタイルを使用します。

于 2013-08-04T16:47:01.683 に答える
0

これが私の解決策です。lodash の_.sortBy()複数列ソート関数よりも約 2 倍高速です (参照http://jsperf.com/multi-column-sort。ソート関数のテキストを生成し、それを標準の .sort()で使用します。Chrome と Firefox でも動作します。

function multiColumnSort(arr,sf) {
    var s = '';
    sf.forEach(function(f,idx) {
        s += 'if(arguments[0].'+f+'>arguments[1].'+f+')return 1;';
        s += 'else if(arguments[0].'+f+'==arguments[1].'+f+')';
        s += (idx < sf.length-1)? '{' : 'return 0';
    });
    s += Array(sf.length).join('}')+';return -1';
    return arr.sort(new Function(s));
};
于 2014-02-17T19:35:51.390 に答える