web-dev-qa-db-ja.com

JavaScriptの値で辞書を並べ替える

これが私の辞書です:

_const dict = {
  "x" : 1,
  "y" : 6,
  "z" : 9,
  "a" : 5,
  "b" : 7,
  "c" : 11,
  "d" : 17,
  "t" : 3
};
_

dict辞書を最小から最大、または最大から最小に並べ替える方法が必要です。または、ソートされたキーを含む配列があれば大丈夫です。しかし、javascriptを使用してこのようなことを行う方法はわかりません。次のように、pythonを使用する前に実行しました。

_import heapq
from operator import itemgetter

thirty_largest = heapq.nlargest(8, dict.iteritems(), key=itemgetter(1))
_

Googleで検索しましたが、配列にはsort()関数がありますが、辞書はありません。だから私の質問は:辞書をソートするにはどうすればよいですか or ソート順で上位5つの最大値を取得しますか?

23
Michael

JavaScriptでは簡単ではないかもしれません。

var dict = {
  "x": 1,
  "y": 6,
  "z": 9,
  "a": 5,
  "b": 7,
  "c": 11,
  "d": 17,
  "t": 3
};

// Create items array
var items = Object.keys(dict).map(function(key) {
  return [key, dict[key]];
});

// Sort the array based on the second element
items.sort(function(first, second) {
  return second[1] - first[1];
});

// Create a new array with only the first 5 items
console.log(items.slice(0, 5));

最初のステップであるアイテム配列の作成は、Pythonの

items = map(lambda x: [x, var[x]], var.keys())

便利なように書くことができます

items = list(dict.items())

並べ替え手順はcmpパラメーターを使用したPythonの並べ替えに似ています

items.sort(cmp=lambda x, y: y[1] - x[1])

最後のステップはPythonのスライス操作に似ています。

print items[:5]
// [['d', 17], ['c', 11], ['z', 9], ['b', 7], ['y', 6]]
42
thefourtheye

次のコードを試すことができます。値でソートされた整数配列を取得します。

jsFiddleリンク

 function sortJsObject() {
    var dict = {"x" : 1, "y" : 6,  "z" : 9, "a" : 5, "b" : 7, "c" : 11, "d" : 17, "t" : 3};

    var keys = [];
    for(var key in dict) { 
       keys[keys.length] = key;
     }

     var values = [];     
     for(var i = 0; i < keys.length; i++) {
         values[values.length] = dict[keys [i]];
     }

     var sortedValues = values.sort(sortNumber);
     console.log(sortedValues);
}

// this is needed to sort values as integers
function sortNumber(a,b) {
   return a - b;
}

それが役に立てば幸い。

4
Atur

まず最初に、「辞書」と呼ぶものをJavaScriptの「オブジェクト」と呼びます。 「dict」変数はオブジェクトです。

JSではオブジェクトは順序付けられていないため、オブジェクトをソートできません。幸いにも配列は順序付けられています;辞書を配列に変換します。以下をご覧ください。

//dict -> a js object
var dict = {"x" : 1,
        "y" : 6,
        "z" : 9,
        "a" : 5,
        "b" : 7,
        "c" : 11,
        "d" : 17,
        "t" : 3};

//Use the 'keys' function from the Object class to get the keys of your dictionary
//'keys' will be an array containing ["x", "y", "z"...]
var keys = Object.keys(dict);

//Get the number of keys - easy using the array 'length' property
var i, len = keys.length; 

//Sort the keys. We can use the sort() method because 'keys' is an array
keys.sort(); 

//This array will hold your key/value pairs in an ordered way
//it will be an array of objects
var sortedDict = [];

//Now let's go throught your keys in the sorted order
for (i = 0; i < len; i++)
{
    //get the current key
    k = keys[i];

    //show you the key and the value (retrieved by accessing dict with current key)
    alert(k + ':' + dict[k]);

    //Using the array 'Push' method, we add an object at the end of the result array
    //It will hold the key/value pair
    sortedDict.Push({'key': k, 'value':dict[k]});
}

//Result
console.log(sortedDict);

試してみてくださいここ

ソートを変更したい場合、見てください here

最初の5つの最大値が必要な場合は、forループでsortedDictを5回ループし、それらの値を取得します:

function getFiveFirstValues(){
    var valuesArray = [];
    for (i = 0; i < 5; i++)
    {
        valuesArray.Push(sortedDict[i].value);
    }
    return valuesArray;
}

JavaScriptでは、オブジェクトは順序付けられていないことに注意してください。 それらは順序付けられているように見えるかもしれませんが、そうではなく、ブラウザのJS実装に依存します順序は異なる場合があります。

この例では、sortedDictは配列(順序付けられている)であるため、ソートできます。その配列の各要素には、「辞書」の各ペアのKEYとVALUEのペアがあります。

2
Rayjax

厳密に言えば、JavaScriptオブジェクトには順序がないため、「辞書」(JavaScriptオブジェクト)をソートすることはできません。それらは単にキー/値のペアの「バッグ」です。

オブジェクトの最大n個の値を検索する場合は、何らかの方法でオブジェクトを配列に変換する必要があります。配列の要素は、@ thefourtheyeのソリューションなどでare順序付けられています。キーを並べ替える場合は、別の答えが示すように、Object.keys(object).sort()を使用して並べ替えます。

1
user663031

@thefourtheyeが提供する答えはある程度機能しますが、同じ「辞書」構造を返しません。

開始時と同じ構造のソート済みオブジェクトを返すにしたい場合は、受け入れられた回答から返されたアイテムに対してこれを実行できます。

sorted_obj={}
$.each(items, function(k, v) {
    use_key = v[0]
    use_value = v[1]
    sorted_obj[use_key] = use_value
})

単一のJavaScriptオブジェクトをソートする関数

function sort_object(obj) {
    items = Object.keys(obj).map(function(key) {
        return [key, obj[key]];
    });
    items.sort(function(first, second) {
        return second[1] - first[1];
    });
    sorted_obj={}
    $.each(items, function(k, v) {
        use_key = v[0]
        use_value = v[1]
        sorted_obj[use_key] = use_value
    })
    return(sorted_obj)
} 

単純にオブジェクトをsort_object関数に渡す

dict = {
  "x" : 1,
  "y" : 6,
  "z" : 9,
  "a" : 5,
  "b" : 7,
  "c" : 11,
  "d" : 17,
  "t" : 3
};

sort_object(dict)

結果

{
"d":17,
"c":11,
"z":9,
"b":7,
"y":6,
"a":5,
"t":3,
"x":1
}

"Proof"

res = sort_object(dict)

$.each(res, function(elem, index) {
    alert(elem)
})
1
Cybernetic