source

JSON에서 고유한 값 선택

itover 2023. 2. 15. 21:51
반응형

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"}

어떤 좋은 방법이 있을까요?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++;
  }
}

있나요?better method그래서 더 좋은 퍼포먼스를 얻을 수 있었던 거죠?

사이클을 절약하려면 오브젝트 하나와 어레이 하나를 사용합니다.

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)하지만 그보다 빠르지는 않을 겁니다.

Underscore.js는 이런 경우에 적합합니다.를 사용하여 다음 중 하나의 카운트를 취득할 수 있습니다.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(_.countBy(data, function(data) { return data.name; }));

제공 내용:

["ajax", "javascript", "jquery"]

고유한 Jquery 메서드를 사용합니다.

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

alert($.unique(names));

JSFiddle

이것은 감량하기 좋은 장소이다.

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

일단 도망가면 돼map()새로운 배열을 취득하기 위한 함수로, 이 함수의 모든 요소에 대해 지정된 함수를 호출한 결과입니다.varjson.DATA.

varjson.DATA.map(({name})=>name))

의 어레이를 취득한 후name에서varjson.DATA. 어레이의 모든 중복된 엔트리를 폐기하고 확산 연산자를 적용하여 고유한 이름의 배열을 얻을 수 있습니다.

[...new Set(varjson.DATA.map(({name})=>name))]

const varjson = {
  "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"
}

console.log( [...new Set(varjson.DATA.map(({name})=>name))]);

여기서 알 수 있듯이, 더 많은 가치를 가지고 있을 때 더 나은 접근법이 있습니다.

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]);
}

여기에서는 다음 명령어를 사용하여 개체를 만듭니다.name열쇠로 삼습니다.값은 단순히 배열의 원래 개체입니다.이렇게 하면 각 교환품이 O(1)가 되며 이미 존재하는지 확인할 필요가 없습니다.그런 다음 각 값을 꺼내어 어레이를 다시 채웁니다.

메모
소규모 어레이의 경우 접근 속도가 약간 빨라집니다.

주 2
이렇게 하면 원래 주문이 유지되지 않습니다.

MYJSON이 JSON 데이터가 됩니다.

var mytky=[];
mytky=DistinctRecords(MYJSON,"mykeyname");

function DistinctRecords(MYJSON,prop) {
  return MYJSON.filter((obj, pos, arr) => {
    return arr.map(mapObj => mapObj[prop]).indexOf(obj[prop]) === pos;
 })
}

한 번 해보세요.

var distinct_list 

  = data.DATA.map(function (d) {return d[x];}).filter((v, i, a) => a.indexOf(v) === i)

언급URL : https://stackoverflow.com/questions/17780508/selecting-distinct-values-from-a-json

반응형