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));
이것은 감량하기 좋은 장소이다.
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))]);
여기서 알 수 있듯이, 더 많은 가치를 가지고 있을 때 더 나은 접근법이 있습니다.
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
'source' 카테고리의 다른 글
| 웹 팩을 사용하여 인라인 svg를 설정하는 방법 (0) | 2023.02.15 |
|---|---|
| jq를 사용하여 JSONL을 출력하는 방법(1줄에 1개의 독립된 JSON 객체) (0) | 2023.02.15 |
| 구글 지도를 앵귤러로 초기화하다JS (0) | 2023.02.15 |
| null, 비어 있거나 정의되지 않은 angularjs 확인 (0) | 2023.02.15 |
| 리액트 훅 - 후드 아래에서 무슨 일이 일어나고 있습니까? (0) | 2023.02.15 |