filter() 메서드를 사용하여 JavaScript의 배열 배열에서 고유 한 값을 얻는 방법은 무엇입니까?




arrays (5)

효과적인 해결책 :

O(n) 연산. 여기서 nx 배열의 길이입니다.

O(n) 메모리 공간. 여기서 nx 배열의 길이입니다.

const x = [[1, 2], [3, 4], [1, 2]];

const arrayTable = Object.create(null);

const uniqueArrays = x.filter(arr => {
  const arrStr = JSON.stringify(arr);

  if (!arrayTable[arrStr]) {
    arrayTable[arrStr] = true;
    return true;
  }

  return false;
});

console.log(uniqueArrays);

이 질문에는 이미 답변이 있습니다.

다음과 같은 배열이 있습니다.

let x = [[1, 2], [3, 4], [1, 2], [2, 1]];

중복없이 배열을 검색하려면 어떻게해야합니까?

[[1, 2], [3, 4], [2, 1]];

필터 방법을 사용하고 싶습니다. 나는 이것을 시도했지만 작동하지 않습니다 :

x.filter((value,index,self) => (self.indexOf(value) === index))

편집 : 필터 방법을 사용하도록 지정한 것처럼이 질문이 중복이라고 생각하지 않습니다. 또한 몇 가지 흥미로운 답변이 있습니다.


내부 배열을 문자열로 변환 한 다음 듀프를 필터링하고 문자열을 다시 구문 분석하십시오.

let x = [[1, 2], [3, 4], [1, 2]];

var unique = x.map(ar=>JSON.stringify(ar))
  .filter((itm, idx, arr) => arr.indexOf(itm) === idx)
  .map(str=>JSON.parse(str));

console.log(unique);


이것은 시간 복잡도가 O (n) 인 솔루션입니다. 여기서 n은 배열의 요소 수입니다.

OP가 원하는대로 필터 방법을 사용하는 경우 :

    const x = [[1, 2], [3, 4], [1, 2], [2, 1]];
    const s = new Set();


    const res = x.filter(el => {
      if(!s.has(el.join(""))) {
        s.add(el.join(""));
        return true;
      }
      return false
    })

    console.log(res)

여기서 개인적으로 선호하는 것은 ForEach를 더 읽기 쉽도록 사용하는 것입니다.

const x = [[1, 2], [3, 4], [1, 2], [2, 1]];
const s = new Set();
const res = [];

x.forEach(el => {
  if(!s.has(el.join(""))) {
    s.add(el.join(""));
    res.push(el)
  }
})

console.log(res);

우리는 Set과 배열 요소의 간단한 조합을 사용하여 고유한지 확인합니다. 그렇지 않으면 이것은 O (n ^ 2)가됩니다.


좋아, 문자열 해시 아이디어는 훌륭합니다. I wrestled a bear once 소품 I wrestled a bear once . 코드 자체가 조금 나을 수 있다고 생각하므로 다음과 같은 유형의 작업을 수행하는 방법이 있습니다.

let x = [[1, 2], [3, 4], [1, 2]];
const map = new Map();
x.forEach((item) => map.set(item.join(), item));
console.log(Array.from(map.values()));

그리고 추악한 라이너를 원한다면 :

let x = [[1, 2], [3, 4], [1, 2]];
const noRepeats = Array.from((new Map(x.map((item) => [item.join(), item]))).values());
console.log(noRepeats);


indexOfarrays 내에서 동일한 arrays / objects 유형 요소 인스턴스에서 작동하지 않습니다. 이러한 배열은 단지 참조를 보유하기 때문입니다.

필터 함수 인스턴스에서는 매개 변수 v (아래 코드)를 통해 배열에 저장된 것과 동일한 인스턴스가 아니므로 indexOf 가 인덱스를 반환 할 수 없습니다.

아래 코드에서 객체를 문자열로 변환하여 indexOf 를 사용하여 중복을 찾을 수 있습니다.

let x = [[1, 2], [3, 4], [1, 2], [2, 1]];

console.log(x.
  map(function(v){
    return JSON.stringify(v)
  })
  .filter(function(v, i, o) {
    return o.length == i ? true : o.slice(i + 1).indexOf(v) == -1;
  })
  .map(function(v) {
    return JSON.parse(v)
  })
);







arrays