본문 바로가기

개발/ES6

Javascript ES6 - Set 기능 내부 구현해보기

 

const list = [3, 4, 3, 5, 10, 7, 1, 5, 4, 10];

function mySet(list) {
  let result = {};
  for (let i = 0; i < list.length; i++) {
    if (result[list[i]] === undefined) {
      result[list[i]] = [list[i]];
    } else {
      result[list[i]].push(list[i]);
    }
  }
  console.log(Object.keys(result));
  return result;
}

console.log(new Set(list));
console.log(mySet(list));

 

Set 함수를 사용하지 않고 날 것으로 mySet 함수를 구현해보았다.

Object 객체를 만들고, Key 값으로 따져볼 것이다. 만일 해당 숫자가 Key로 존재한다면 value에 해당 숫자를 한 번 더 추가해준다.

존재하지 않는다면 Key를 추가해준다.

 

 

기존 Set 함수와는 차이가 있는 것이 Set 함수는 정렬을 해주지 않고 중복 제거만 해주며 Object 형태로 반환해준다.

반면, Object.Key()의 경우에는 반환을 배열로 해준다. 그러나 Object는 순서를 보장해주지 않기 때문에 100% 신뢰하기는 어렵다.

 

그렇다면, 중복 제거하면서 정렬까지 같이 해주는 코드는 어떻게 될까?

 

list = [10, 8, 2, 1, 1, 2, 3, 4, 3, 2, 6, 6];
// 정렬을 시키면서 중복을 없앤다.
let result = [];

for (let i = 0; i < list.length; i++) {
  let isExist = result.includes(list[i]);
  //   for (let j = 0; j < result.length; j++) {
  //     if (result[j] === list[i]) {
  //       isExist = true;
  //       break;
  //     }
  //   }

  if (isExist === false) {
    if (result.length === 0) {
      result.push(list[i]);
      continue;
    }

    let idx = -1;
    for (let k = 0; k < result.length; k++) {
      if (result[k] > list[i]) {
        idx = k;
        break;
      }
    }
    if (idx < 0) {
      result.push(list[i]);
    } else {
      result.splice(idx, 0, list[i]);
    }
    console.log(idx, result);
  }
}
console.log(`result : ${result}`);
console.log(new Set(list));