过滤对象结果的经济方法

时间:2012-12-02 20:58:41

标签: javascript

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

我的数据:

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

等等,列表大约50 - 100。

我知道我可以迭代并构建一个列表,但我很好奇是否有任何较少的处理器密集型方法来根据该属性(movies[title].votes)过滤这些结果。

非常感谢任何帮助,谢谢。

3 个答案:

答案 0 :(得分: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);

Demonstration (open the console)

答案 1 :(得分: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)

答案 2 :(得分: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

enter image description here