# 배열 내 객체 중복 id 값 제거

배열 내 객체 프로퍼티 값 중에 중복으로 들어간 것을 제거하는 작업은 정말 많이 쓰입니다. 여러가지 방법으로 해결해보겠습니다.

# 예시

// id가 중복되는 것을 제거하시오

let example = [{ id: 123 }, { id: 456 }, { id: 123 }];

# lodash

  • loadsh를 사용하신다면 아주 간편하게 한줄로 중복을 제거 할 수있습니다.
_.uniqBy(example, "id");

# reduce

  • accumulator를 이용하여 중복제거합니다.
example.reduce(function(acc, current) {
  if (acc.findIndex(({ id }) => id === current.id) === -1) {
    acc.push(current);
  }
  return acc;
}, []);

# filter

# 1번 풀이

example.filter((item, i) => {
  return (
    example.findIndex((item2, j) => {
      return item.id === item2.id;
    }) === i
  );
});

# 2번 풀이

  • filter에는 3번째 인자로 callback 함수가 들어갑니다. 이것을 이용한 방법
example.filter(
  (arr, index, callback) => index === callback.findIndex(t => t.id === arr.id)
);

# new Set()

  • Set을 이용하여 중복 제거합니다.
[...new Set(example.map(JSON.stringify))].map(JSON.parse);
  • 하나의 맹점이 있습니다
    • id가 같으나, 다른 속성이 있다면, 중복이라 생각하지 않고 리턴합니다. 아래와 같은 경우입니다.
    const example2 = [
      { id: 123, name: "nkh" },
      { id: 123, name: "ddd" },
      { id: 5456, name: "zxc" }
    ];
    console.log([...new Set(example2.map(JSON.stringify))].map(JSON.parse));
    // [{id: 123,  name: 'nkh'}, {id: 123, name: 'ddd'}, {id: 5456, name: 'zxc'}]
    
  • 즉, 객체의 속성이 1개만 있거나, 객체 값이 완전히 같은 것을 중복 제거 할 경우만 new Set을 써야합니다.
Last Updated: 3/24/2021, 8:55:12 PM