2017-05-17 19 views
0

オブジェクトを宣言しました。値に基づいてキー値のペアを持つオブジェクトをソート

VAR OBJ = { "1": "2"、 "Google" と "ヤフー"、 "3": "MSN"、 "4": "StackOverflowの"、 "5": " 「github」、 「6」:「jsfiddle」、 「7」:「amazon」、 「8」:「ebay」 };

値に基づいてソートし、それを配列にプッシュする必要があり、配列を表示する必要があります。 値に基づいてオブジェクトをソートし、配列にプッシュしました。しかし、配列の表示では、値はキーに基づいてソートされます。 キーが数字であるため、配列やオブジェクトにプッシュする際に値がデフォルトでキーに基づいてソートされていることがわかりました。私はキーにある値を変更したくありません。これを克服するための代替手段があることを私に教えてください。事前に

おかげで、 チャンダン

+0

それはあなたが何を意味するかは明らかではないのか?アルファベット順のソート?また、どのように配列に追加していますか? – Pogrindis

+0

配列を使用できるときに、なぜオブジェクトを使用していますか? – evolutionxbox

+0

例:入力:{"10": "インド"、 "12": "オーストラリア"、 "17": "中国"}。出力:{"12": "オーストラリア"、 "17": "中国"、 "10": "インド"}配列やオブジェクトは問題ありません。しかし、データは値に基づいてソートする必要があります – Chandan12

答えて

1

まあ、並べ替えについて私はあなたが実際にJS内の配列だけをソートできることを指摘したいと思います。つまり、オブジェクトを「並べ替える」こともできますが、そのような場合は後でオブジェクトをトラバースするときに順序が保証されません。

一方、配列をソートする際、キーを保存するのは意味がありません。なぜなら、値の最終的な順序はキーに基づいているため、値による並べ替えは無意味になります。

私は入力のフォーマットを変更し、オブジェクトの配列をソートします。キー(および必要に応じて他の属性)を保存し、値に基づいて注文を行うことができます。あなたが必要として、これはオブジェクトをソートしますが、最終的な順序は保持されません:

だから、あなたの入力は

var arr = [{id: "10", country:"India"}, {id:"12", country:"Australia"}, {id:"17", country:"China"}]; 
 

 
for(var i = 1; i < arr.length; i++) { 
 
    var temp = arr[i]; 
 
    for(var j = i - 1; j >= 0 && temp['country'] < arr[j]['country']; j--) arr[j + 1] = arr[j]; 
 
    arr[j + 1] = temp; 
 
} 
 

 
// or just use the default JS function: 
 
/*arr.sort(function(a, b) { 
 
    return a.country > b.country; 
 
}); 
 
*/ 
 

 
console.log(arr);

され、冒頭で私が言ったことを示すために、言うことができます

var obj = {"10":"India", "12": "Australia","17":"China"}, sorted = {}; // or [] 
 
var arr = []; // array of countries 
 

 
// sorting countries 
 
for(var key in obj) arr.push(obj[key]); 
 
arr.sort(); 
 

 
// creating a data structure "sorted" in a "sorted" order 
 
for(var i = 0; i < arr.length; i++) { 
 
    for(var key in obj) if(obj[key] == arr[i]) { 
 
     console.log(arr[i]); // seems it kind of writes it in the right order - Aus, Chi, Ind... 
 
     sorted[key] = arr[i]; } 
 
} 
 
console.log(sorted); // ...but outputs differently (I use Chrome)

+0

私は同じ問題を抱えていますが、キーでオブジェクトを並べ替えることができますが、最終出力は同じではありません。ここでは、単純なソートは、lodash '_(inputObject).toPairs()。sortBy(0).fromPairs()。value();' – Majid

0
Object.keys(obj).reduce((arr,key)=>(arr[key]=obj[key],arr),[]); 

単にまばらな配列を作成しますか?

は、この作成します。

[undefined, "google", "yahoo", "msn", "stackoverflow", "github", "jsfiddle", "amazon", "ebay"] 

それとも、単にやって、それから配列を作る:

Object.setPrototypeOf(obj,Array.prototype); 
1

あなたがちょうど必要とするよりも、配列

var arr = $.map(obj, function(el) { return el }); 

に変換、これを使用して必要に応じてソートする

+0

非常に大きなオブジェクト(10k行の順番)のパフォーマンスについてはわかりませんが、これは私を助けました – clod986

関連する問題