从JSON中选择不同的值

Nit*_*esh 27 javascript jquery json

我有我的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"}
Run Code Online (Sandbox Code Playgroud)

有没有什么好方法可以distinct name从这个JSON中找到它

结果 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++;
  }
}
Run Code Online (Sandbox Code Playgroud)

有什么better method能给我带来更好的表现吗?

ZER*_*ER0 53

如果你想节省一些周期,我会使用一个Object和一个Array:

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);
  }
}
Run Code Online (Sandbox Code Playgroud)

通过这种方式你基本上避免了indexOf/ inArraycall,你会得到一个可以迭代比迭代对象属性更快的数组 - 也因为在第二种情况下你需要检查hasOwnProperty.

当然,如果你只使用一个对象就可以了,你可以避免检查result.push,并且万一,以防万一使用Object.keys(lookup),但它不会比这更快.


Chr*_*our 16

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; });
Run Code Online (Sandbox Code Playgroud)

得到:

{ajax: 4, javascript: 1, jquery: 2} 
Run Code Online (Sandbox Code Playgroud)

对于一组键只需使用 _.keys()

_.keys(_.countBy(data, function(data) { return data.name; }));
Run Code Online (Sandbox Code Playgroud)

得到:

["ajax", "javascript", "jquery"]
Run Code Online (Sandbox Code Playgroud)


Har*_*gar 15

使用Jquery方法唯一.

var UniqueNames= $.unique(data.DATA.map(function (d) {return d.name;}));

alert($.unique(names));
Run Code Online (Sandbox Code Playgroud)

的jsfiddle


小智 11

首先,我们可以运行map()函数来获取新数组,并在varjson.DATA.

varjson.DATA.map(({name})=>name))
Run Code Online (Sandbox Code Playgroud)

name从获取数组后varjson.DATA。我们可以将其转换为一个集合,该集合将丢弃数组的所有重复条目并应用扩展运算符来获取唯一名称的数组:

[...new Set(varjson.DATA.map(({name})=>name))]
Run Code Online (Sandbox Code Playgroud)

varjson.DATA.map(({name})=>name))
Run Code Online (Sandbox Code Playgroud)


Eva*_*den 8

这是减少的好地方

var uniqueArray = o.DATA.reduce(function (a, d) {
       if (a.indexOf(d.name) === -1) {
         a.push(d.name);
       }
       return a;
    }, []);
Run Code Online (Sandbox Code Playgroud)


sbe*_*rry 6

正如你在这里看到的,当你有更多的价值时,有更好的方法.

http://jsfiddle.net/MsYGJ/

temp = {}
// Store each of the elements in an object keyed of of the name field.  If there is a collision (the name already exists) then it is just replaced with the most recent one.
for (var i = 0; i < varjson.DATA.length; i++) {
    temp[varjson.DATA[i].name] = varjson.DATA[i];
}
// Reset the array in varjson
varjson.DATA = [];
// Push each of the values back into the array.
for (var o in temp) {
    varjson.DATA.push(temp[o]);
}
Run Code Online (Sandbox Code Playgroud)

这里我们用name关键字创建一个对象.该值只是数组中的原始对象.这样做,每个替换都是O(1),并且不需要检查它是否已经存在.然后,将每个值拉出并重新填充数组.

注意
对于较小的阵列,您的方法稍快一些.

注2:
这不会保留原始订单.