我有一个JSON文件,我只需要检索分数最高的项目:
我的数据:
{
"movies" : {
"eraserhead" : {
"full_title" : "Eraserhead",
"votes": 50
},
"psycho" : {
"full_title" : "Psycho",
"votes" : 90
}
}
}
等等,列表大约50 - 100。
我知道我可以迭代并构建一个列表,但我很好奇是否有任何较少的处理器密集型方法来根据该属性(movies[title].votes
)过滤这些结果。
非常感谢任何帮助,谢谢。
答案 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);
答案 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