我的JSON如下所示
{"DATA": [{"id":11,"name":"ajax","subject":"OR","mark":63},
{"id":12,"name":"javascript","subject":"OR","mark":63},
{"id":13,"name":"jquery","subject":"OR","mark":63},
{"id":14,"name":"ajax","subject":"OR","mark":63},
{"id":15,"name":"jquery","subject":"OR","mark":63},
{"id":16,"name":"ajax","subject":"OR","mark":63},
{"id":20,"name":"ajax","subject":"OR","mark":63}],"COUNT":"120"}
有没有什么好的方法可以从这个JSON中找到distinct name
结果javascript,jquery,ajax
我可以使用下面的方法做到这一点
var arr=[''];
var j=0;
for (var i = 0; i < varjson.DATA.length; i++) {
if($.inArray(varjson.DATA[i]["name"],arr)<0){
arr[j]=varjson.DATA[i]["name"];
j++;
}
}
有没有性能更好的better method
?
发布于 2013-07-22 14:18:18
如果你想节省一些周期,我会使用一个对象和一个数组:
var lookup = {};
var items = json.DATA;
var result = [];
for (var item, i = 0; item = items[i++];) {
var name = item.name;
if (!(name in lookup)) {
lookup[name] = 1;
result.push(name);
}
}
这样基本上就避免了indexOf
/ inArray
调用,并且您将得到一个迭代速度比迭代对象属性更快的数组-这也是因为在第二种情况下,您需要检查hasOwnProperty
。
当然,如果你只需要一个对象,你就完全可以避免检查和result.push
,如果使用Object.keys(lookup)
来获取数组,但它不会比这更快。
发布于 2014-03-16 08:34:17
对于这类事情,Underscore.js非常好用。您可以使用_.countBy()
来获取每个name
的计数
data = [{"id":11,"name":"ajax","subject":"OR","mark":63},
{"id":12,"name":"javascript","subject":"OR","mark":63},
{"id":13,"name":"jquery","subject":"OR","mark":63},
{"id":14,"name":"ajax","subject":"OR","mark":63},
{"id":15,"name":"jquery","subject":"OR","mark":63},
{"id":16,"name":"ajax","subject":"OR","mark":63},
{"id":20,"name":"ajax","subject":"OR","mark":63}]
_.countBy(data, function(data) { return data.name; });
提供:
{ajax: 4, javascript: 1, jquery: 2}
对于键的数组,只需使用_.keys()
_.keys(_.countBy(data, function(data) { return data.name; }));
提供:
["ajax", "javascript", "jquery"]
发布于 2013-07-22 14:27:13
使用唯一的Jquery方法。
var UniqueNames= $.unique(data.DATA.map(function (d) {return d.name;}));
alert($.unique(names));
https://stackoverflow.com/questions/17780508
复制相似问题