반응형

 

 

Javascript 쓰다 보면 [] (Array)를 쓸 일이 굉장히 많다.

 

그리고 array 값 중 중복된 값들을 제거하고 싶을 때가 온다.

 

 

일단 array 내 element 가 object 가 아님을 전제로 하였을 때

 

new Set() 를 사용한다.

 

set 객체는 자료형에 상관없이 유일한 값만 저장시킨다고 모질라에 나와있지만 확인 결과, object 형식은 안되는 것 같다.

 

var arr = [];
for (var i = 0; i < 5; i++) {
    arr.push("a");
}
var newArr = [...new Set(arr)];
console.log("===== String =====");
console.log(newArr);
console.log("===== String =====");

var arr = [];
for (var i = 0; i < 5; i++) {
    arr.push({ name: "a", value: 1 });
}
var newArr = [...new Set(arr)];
console.log("===== Object =====");
console.log(newArr);
console.log("===== Object =====");

 

 

console 결과값

 

 

그래서 다시 구글링을 해봤다

 

stackoverflow.com/questions/2218999/how-to-remove-all-duplicates-from-an-array-of-objects

 

How to remove all duplicates from an array of objects?

I have an object that contains an array of objects. things = new Object(); things.thing = new Array(); things.thing.push({place:"here",name:"stuff"}); things.thing.push({place:"there",name:"more...

stackoverflow.com

 

 

var arr = [];
for (var i = 0; i < 5; i++) {
    arr.push({ name: "a", value: 1 });
}
var newArr = arr.filter((item, index, array) => array.findIndex(compared => (compared.name === item.name && compared.value === item.value)) === index);
console.log("===== filtered =====");
console.log(newArr);
console.log("===== filtered =====");

 

 

deleteDuplicates

 

 

 

같은 값을 가지고 있는 것 중에 index가 가장 빠른 것들의 값만 추리는 것 같다.

 

 

다른 방법이 없는지 다음에 더 찾아보겠다.

 

 

 

 

 

 

------ 2021-04-22

 

 

developer.mozilla.org/ko/docs/Web/JavaScript/Reference/Global_Objects/Array/Reduce

 

Array.prototype.reduce() - JavaScript | MDN

Array.prototype.reduce() reduce() 메서드는 배열의 각 요소에 대해 주어진 리듀서(reducer) 함수를 실행하고, 하나의 결과값을 반환합니다. 리듀서 함수는 네 개의 인자를 가집니다. 누산기accumulator (acc)

developer.mozilla.org

 

 

모질라에 reducer를 이용하여 배열의 중복항목 제거 방법이 나와있길래 시도해보려 한다.

 

 

 

사실 이 포스팅 수정하다가 알게 됨!

 

binaryjourney.tistory.com/68

 

[Javascript] Array.from(), Array.prototype.reduce() (feat. 프로그래머스 다리를 지나는 트럭)

프로그래머스에서 <다리를 지나는 트럭> 풀다 막힌 문제인데 내 첫 식은 이랬다. function solution(bridge_length, weight, truck_weights) { let seconds = 0; let onBridge = [ ...truck_weights ]; do { let s..

binaryjourney.tistory.com

 

 

 

 

예제는 이렇다

 

let arr = [1, 2, 1, 2, 3, 5, 4, 5, 3, 4, 4, 4, 4];
let result = arr.sort().reduce((accumulator, current) => {
    const length = accumulator.length
    if (length === 0 || accumulator[length - 1] !== current) {
        accumulator.push(current);
    }
    return accumulator;
}, []);
console.log(result); //[1,2,3,4,5]

 

 

 

위의 방법을 응용하여 해보았다.

 

var arr = [];
for (var i = 0; i < 5; i++) {
    arr.push("a");
}

var result = arr.reduce((rv, current) => {
    var length = rv.length;
    if (length === 0 || rv[length - 1]["name"] !== current["name"]) {
        rv.push(current);
    }
    return rv;
}, []);

 

된다!

 

 

(단 이 방법은 안에 객체가 모두 같은 데이터를 갖고 있기에 가능했던 것이고

 

만약 value가 다 다른 객체였다면 일단 sort를 먼저 한 다음에 해야 빼먹은 요소 없이 중복제거가 가능하다.)

 

 

 

반응형

+ Recent posts