86

私は連想配列を持っています:

array["sub2"] = 1;
array["sub0"] = -1;
array["sub1"] = 0;
array["sub3"] = 1;
array["sub4"] = 0;

結果がこの順序でそれぞれのインデックスを持つ配列になる値でソート (降順) する最もエレガントな方法は何ですか:

sub2, sub3, sub1, sub4, sub0
4

10 に答える 10

88

「連想配列」のセマンティクスを修正する代わりに、これがあなたが望むものだと思います:

function getSortedKeys(obj) {
    var keys = Object.keys(obj);
    return keys.sort(function(a,b){return obj[b]-obj[a]});
}

本当に古いブラウザの場合は、代わりにこれを使用してください:

function getSortedKeys(obj) {
    var keys = []; for(var key in obj) keys.push(key);
    return keys.sort(function(a,b){return obj[b]-obj[a]});
}

あなたは(あなたのもののような)オブジェクトにダンプし、キーの配列を取得します-ええと、プロパティ-バック、ええ、オブジェクトの値の(数値)値によって降順でソートされます。

これは、値が数値である場合にのみ機能します。function(a,b)並べ替えメカニズムを昇順で動作するように変更したり、値に対して動作するように変更したりするには、少し調整してくださいstring(たとえば)。読者の演習として残しておきます。

于 2012-08-04T20:25:16.210 に答える
19

How to sort an (associative) array by value?でカバーされている継続的な議論とその他のソリューション (私の場合)最良の解決策はsamlによるものです(以下に引用)。

配列は数値インデックスのみを持つことができます。これをオブジェクトまたはオブジェクトの配列として書き直す必要があります。

var status = new Array();
status.push({name: 'BOB', val: 10});
status.push({name: 'TOM', val: 3});
status.push({name: 'ROB', val: 22});
status.push({name: 'JON', val: 7});

メソッドが気に入ったら、次のstatus.push方法で並べ替えることができます。

status.sort(function(a,b) {
    return a.val - b.val;
});
于 2012-10-08T23:27:24.363 に答える
1

私はjqueryの$.eachを使用しますが、forループで作成できます。改善点は次のとおりです。

        //.ArraySort(array)
        /* Sort an array
         */
        ArraySort = function(array, sortFunc){
              var tmp = [];
              var aSorted=[];
              var oSorted={};

              for (var k in array) {
                if (array.hasOwnProperty(k)) 
                    tmp.push({key: k, value:  array[k]});
              }

              tmp.sort(function(o1, o2) {
                    return sortFunc(o1.value, o2.value);
              });                     

              if(Object.prototype.toString.call(array) === '[object Array]'){
                  $.each(tmp, function(index, value){
                      aSorted.push(value.value);
                  });
                  return aSorted;                     
              }

              if(Object.prototype.toString.call(array) === '[object Object]'){
                  $.each(tmp, function(index, value){
                      oSorted[value.key]=value.value;
                  });                     
                  return oSorted;
              }               
     };

だから今あなたはすることができます

    console.log("ArraySort");
    var arr1 = [4,3,6,1,2,8,5,9,9];
    var arr2 = {'a':4, 'b':3, 'c':6, 'd':1, 'e':2, 'f':8, 'g':5, 'h':9};
    var arr3 = {a: 'green', b: 'brown', c: 'blue', d: 'red'};
    var result1 = ArraySort(arr1, function(a,b){return a-b});
    var result2 = ArraySort(arr2, function(a,b){return a-b});
    var result3 = ArraySort(arr3, function(a,b){return a>b});
    console.log(result1);
    console.log(result2);       
    console.log(result3);
于 2012-07-19T13:22:36.050 に答える
0

ちょうどそこにあり、誰かがタプルベースのソートを探しています。これは、配列内のオブジェクトの最初の要素を比較し、2 番目の要素などを比較します。つまり、以下の例では、最初に "a" で比較し、次に "b" で比較します。

let arr = [
    {a:1, b:2, c:3},
    {a:3, b:5, c:1},
    {a:2, b:3, c:9},
    {a:2, b:5, c:9},
    {a:2, b:3, c:10}    
]

function getSortedScore(obj) {
    var keys = []; 
    for(var key in obj[0]) keys.push(key);
    return obj.sort(function(a,b){
        for (var i in keys) {
            let k = keys[i];
            if (a[k]-b[k] > 0) return -1;
            else if (a[k]-b[k] < 0) return 1;
            else continue;
        };
    });
}

console.log(getSortedScore(arr))

出力

 [ { a: 3, b: 5, c: 1 },
  { a: 2, b: 5, c: 9 },
  { a: 2, b: 3, c: 10 },
  { a: 2, b: 3, c: 9 },
  { a: 1, b: 2, c: 3 } ]
于 2017-06-27T10:45:34.800 に答える
-4

@commonpikeの答えは「正しいもの」ですが、彼がコメントを続けると...

最近のほとんどのブラウザはサポートするだけですObject.keys()

ええ..はるかObject.keys()良いです。

しかし、さらに良いのは何ですか? ああ、それは中にありcoffeescriptます!

sortedKeys = (x) -> Object.keys(x).sort (a,b) -> x[a] - x[b]

sortedKeys
  'a' :  1
  'b' :  3
  'c' :  4
  'd' : -1

[ 'd', 'a', 'b', 'c' ]

于 2015-11-03T03:00:42.610 に答える