2017-09-19 10 views
0

javascriptにオブジェクト配列の3つの最大値があります。ここでjavascriptのオブジェクト配列の3つの最大値を見つける

は、オブジェクトの私の配列です:

data = [ 
{"name" : "Ariana" , "score" : "130"}, 
{"name" : "Iggy" , "score" : "270"}, 
{"name" : "Aron" , "score" : "30"}, 
{"name" : "Josh" , "score" : "20"}, 
{"name" : "Kevin" , "score" : "10"}, 
{"name" : "John" , "score" : "80"}, 
{"name" : "Nicky" , "score" : "45"}] 

私は検索配列:

dataTop3 = [ 
{"name" : "Ariana" , "score" : "130"}, 
{"name" : "Iggy" , "score" : "270"}, 
{"name" : "John" , "score" : "80"}] 

私はこのコードで大きなものを見つけることができました

function value_max(data){ 
    var max=0; 
    for (i in data) if(data[i]>max) max=data[i]; 
    return max; 
} 
max=value_max(data); 
+0

私はあなたの質問が何であるかを知らない – ControlAltDel

+0

まず、以下を参照してください。https://stackoverflow.com/questions/16096872/how-to-sort-2-dimensional-array-by-column-value用ソート、必要に応じて「スプライス」または「スライス」を参照してください。違いは、w3schoolなどです。 – Aaron

答えて

0

あなたはこのような何かをしようとしたことがありますか?

while (data.length > 3) { 
    if (data[3] > data[2]) { 
     data.splice(2,1); 
    } else if (data[3] > data[1]) { 
     data.splice(1,1); 
    } else if (data[3] > data[0]) { 
     data.splice(0,1); 
    } else { 
     data.splice(3,1); 
    } 
} 
dataTop3 = data; 
1

In yoあなたは1つの値だけを与える最後の条件に基づいて各反復でmaxの値を置き換えます。複数の値を返すには配列を使う必要があります。

解決策は、各オブジェクトのスコアキーを比較するコンパレータ関数を使用して配列全体を並べ替え、必要に応じてトップk値を使用することです。

var data = [ 
 
{"name" : "Ariana" , "score" : "130"}, 
 
{"name" : "Iggy" , "score" : "270"}, 
 
{"name" : "Aron" , "score" : "30"}, 
 
{"name" : "Josh" , "score" : "20"}, 
 
{"name" : "Kevin" , "score" : "10"}, 
 
{"name" : "John" , "score" : "80"}, 
 
{"name" : "Nicky" , "score" : "45"}]; 
 

 

 
data.sort((x,y) => y.score-x.score); 
 

 
console.log(data.splice(0,3));

別の解決策は、サイズ4の配列を維持し、各反復でそれをソートし、最後の位置の次の要素を追加することであろう。

var data = [ 
 
{"name" : "Ariana" , "score" : "130"}, 
 
{"name" : "Iggy" , "score" : "270"}, 
 
{"name" : "Aron" , "score" : "30"}, 
 
{"name" : "Josh" , "score" : "20"}, 
 
{"name" : "Kevin" , "score" : "10"}, 
 
{"name" : "John" , "score" : "80"}, 
 
{"name" : "Nicky" , "score" : "45"}]; 
 

 
function value_max(data){ 
 
var max=0, vals = []; 
 
for (i in data) { 
 
    if(vals.length === 4){ 
 
     vals.sort((x,y) => y.score-x.score); 
 
     vals[3] = data[i] 
 
    }else{ 
 
     vals.push(data[i]); 
 
    } 
 
} 
 
vals.sort().pop(); 
 
return vals; 
 
} 
 
max=value_max(data); 
 
console.log(max);

1

あなたは、配列のコピーをソートし、上位のアイテムをスライスできます。

var data = [{ name: "Ariana", score: "130" }, { name: "Iggy", score: "270" }, { name: "Aron", score: "30" }, { name: "Josh", score: "20" }, { name: "Kevin", score: "10" }, { name: "John", score: "80" }, { name: "Nicky", score: "45" }], 
 
    top3 = data 
 
     .slice() 
 
     .sort(function (a, b) { return b.score - a.score; }) 
 
     .slice(0, 3); 
 
    
 
console.log(top3);
.as-console-wrapper { max-height: 100% !important; top: 0; }

+0

あなたは、あなたの解決策が最も速いだけでなく、オリジナルを突然変異させることもありません。しかし、なぜあなたの並べ替えのための太い矢印の代わりにリターンを使いましたか? – Rick

+0

@Rick質問がES6とタグ付けされていないので、ソート部分を '.sort((a、b)=> b.score-a.score)'に置き換えることができます。 –

+0

いいえ、それはいいです、私はes6タグがないことに気付かなかった。良い仕事、skillz。 – Rick

関連する問題