1

我有一个 JSON 文件,我只需要检索得分最高的十个项目:

我的数据:

{
    "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 回答