다음이 있다고 가정합니다.
var array =
[
{"name":"Joe", "age":17},
{"name":"Bob", "age":17},
{"name":"Carl", "age": 35}
]
결과 배열을 얻을 수 있도록 모든 연령대를 배열 할 수있는 가장 좋은 방법은 무엇입니까?
[17, 35]
대안으로 데이터 또는 더 나은 방법을 구성하여 “age”의 값을 확인하고 각 배열의 존재 여부를 확인하고 그렇지 않은 경우 추가 할 수 있도록 각 배열을 반복 할 필요가없는 방법이 있습니까?
어떤 방법이 있다면 반복하지 않고 독특한 연령대를 끌어낼 수 있습니다 …
현재 비효율적 인 방법으로 개선하고 싶습니다 … “어레이”대신 객체의 배열이지만 일부 고유 키 (예 : “1,2,3”)가있는 객체의 “맵”인 경우 그래요 가장 효율적인 방법을 찾고 있습니다.
다음은 현재 내가하는 방법이지만, 반복 작업은 효과가 있지만 효율성이 크지 않은 것처럼 보입니다 …
var distinct = []
for (var i = 0; i < array.length; i++)
if (array[i].age not in distinct)
distinct.push(array[i].age)
답변
이것이 PHP라면 키로 배열을 만들고 array_keys
마지막에 가져갈 것이지만 JS에는 그런 사치가 없습니다. 대신 이것을 시도하십시오 :
var flags = [], output = [], l = array.length, i;
for( i=0; i<l; i++) {
if( flags[array[i].age]) continue;
flags[array[i].age] = true;
output.push(array[i].age);
}
답변
ES6 / ES2015 이상을 사용하는 경우 다음과 같이 할 수 있습니다.
const unique = [...new Set(array.map(item => item.age))];
방법은 다음과 같습니다 .
답변
ES6 사용
let array = [
{ "name": "Joe", "age": 17 },
{ "name": "Bob", "age": 17 },
{ "name": "Carl", "age": 35 }
];
array.map(item => item.age)
.filter((value, index, self) => self.indexOf(value) === index)
> [17, 35]
답변
이와 같은 사전 접근 방식을 사용할 수 있습니다. 기본적으로 “사전”에서 키로 구별 할 값을 지정합니다 (여기서는 사전 모드를 피하기 위해 배열을 객체로 사용합니다). 키가 존재하지 않으면 해당 값을 고유 한 값으로 추가하십시오.
작동하는 데모는 다음과 같습니다.
var array = [{"name":"Joe", "age":17}, {"name":"Bob", "age":17}, {"name":"Carl", "age": 35}];
var unique = [];
var distinct = [];
for( let i = 0; i < array.length; i++ ){
if( !unique[array[i].age]){
distinct.push(array[i].age);
unique[array[i].age] = 1;
}
}
var d = document.getElementById("d");
d.innerHTML = "" + distinct;
<div id="d"></div>
이것은 O (n)입니다. 여기서 n은 배열의 객체 수이고 m은 고유 값의 수입니다. 각 값을 한 번 이상 검사해야하므로 O (n)보다 빠른 방법은 없습니다.
이것의 이전 버전은 객체를 사용했고 안으로 들어 왔습니다. 이것들은 본질적으로 사소한 것이었고, 이후에 약간 업데이트되었습니다. 그러나 원래 jsperf에서 두 버전간에 성능이 향상되는 이유는 데이터 샘플 크기가 너무 작기 때문입니다. 따라서 이전 버전의 주요 비교는 내부 맵과 필터 사용과 사전 모드 조회의 차이점을 살펴 보는 것입니다.
위에서 언급했듯이 위의 코드를 업데이트했지만 3 대신 1000 개의 객체를 살펴보기 위해 jsperf도 업데이트했습니다. 3 관련된 많은 성능 함정을 간과 했습니다. ).
공연
https://jsperf.com/filter-vs-dictionary-more-data 이 사전을 실행할 때 96 % 더 빨랐습니다.
답변
2017 년 8 월 25 일 현재 Typescript 용 ES6를 통한 새로운 세트를 사용하여이 문제를 해결하는 방법입니다.
Array.from(new Set(yourArray.map((item: any) => item.id)))
답변
ES6 기능을 사용하면 다음과 같은 작업을 수행 할 수 있습니다.
const uniqueAges = [...new Set( array.map(obj => obj.age)) ];
답변
Dups를 매핑하고 제거합니다.
var ages = array.map(function(obj) { return obj.age; });
ages = ages.filter(function(v,i) { return ages.indexOf(v) == i; });
console.log(ages); //=> [17, 35]
편집 : Aight! 성능면에서 가장 효율적인 방법은 아니지만 가장 읽기 쉬운 IMO입니다. 마이크로 최적화에 관심이 있거나 엄청난 양의 데이터가 있다면 규칙적인 for
루프가 더 “효율적”입니다.