1

JSON ファイルがあり、最高スコア 10 の項目のみを取得する必要があります。

私のデータ:

{
    "movies" : {
        "eraserhead" : {
               "full_title" : "Eraserhead",
               "votes": 50
         },
        "psycho" : {
               "full_title" : "Psycho",
               "votes" : 90  
         }
    }
}

などなど、約50~100件のリストです。

繰り返し処理してリストを作成できることはわかっていますが、そのプロパティに基づいてこれらの結果をフィルター処理するための、プロセッサへの負担が少ない方法がないか知りたいと思っていました ( movies[title].votes)。

どんな助けでも大歓迎です、ありがとう。

4

3 に答える 3

5

最も簡単なのは、配列を作成し、配列を並べ替えて、最初の10個の要素を取得することです。

var myArray = [];
for (var key in movies) {
    var movie = movies[key];
    movie.title = key; 
    myArray.push(movie);
}
var tenFirst = myArray.sort(function(a,b){return b.votes-a.votes}).slice(0,10);

デモンストレーション(コンソールを開く)

于 2012-12-02T21:00:52.553 に答える
1
var a = obj.movies;
var ar=[],k;
    for(k in a){
    if(a.hasOwnProperty(k)){
        var m=a[k];
        m.title = k;
        ar.push(m);
    }
}

    var sorted = a.sort(function(a,b){return a.votes-b.votes;});
    var first10 = sorted.slice(0,10)
于 2012-12-02T21:06:35.047 に答える
0

並べ替えにはコストがかかります。効率的にしたいと言ったので、次のようにします。

var result = [],
    len, o;

for (var key in data.movies) {
    o = data.movies[key];
    len = result.length
    if (!len) {
        result.push(o);
    } else if (len < 10) {
        if (o.votes < result[0].votes) {
            result.unshift(o);
        } else {
            while (len--) {
                if (o.votes > result[len].votes) {
                    result.splice(len + 1, 0, o);
                    break;
                }
            }
        }
    } else if (o.votes > result[0].votes) {
        result.shift();
        if (o.votes < result[0].votes) {
            result.unshift(o);
            continue;
        }
        len--;
        while (len--) {
            if (o.votes > result[len].votes) {
                result.splice(len + 1, 0, o);
                break;
            }
        }
    }
}

http://jsperf.com/reduce-object-of-objects-to-max-property

ここに画像の説明を入力

于 2012-12-02T21:47:47.700 に答える