JavaScript

[js] 자바스크립트 json array 중복제거, 중복개수 카운팅하기

dev.mk 2023. 1. 14. 15:43
반응형
    //1. overlapArr json array 중복제거
    let overlapArr = [
        { id : 1, name : "이름A", age : 5 },
        { id : 1, name : "이름B", age : 10 },
        { id : 2, name : "이름C", age : 20 },
        { id : 3, name : "이름D", age : 40 },
        { id : 4, name : "이름E", age : 50 },
        { id : 5, name : "이름F", age : 10 },
        { id : 5, name : "이름G", age : 20 },
        { id : 5, name : "이름G", age : 30 } 
     ];
    var deduplicationArr = overlapArr.filter((item1, idx1)=>{
        return overlapArr.findIndex((item2, idx2)=>{
            return item1.id == item2.id;
        }) == idx1;
    });
    console.log(deduplicationArr);
    
    //2. overlapArr 중복개수 출력
    let result = overlapArr.reduce(function(obj, cur) {
        if (!obj[cur.id]) {
            obj[cur.id] = 0;
        }        
        obj[cur.id] += 1;
        //중복건수가 1개이상일때 메세지 출력
        if(obj[cur.id] == 2){
            alert("중복값존재");
        }
        return obj;
    }, {})
    console.log(result);
    
    
    //그 밖의 방법들............
     
    //1. reduce + findIndex 를 이용해서 중복제거하기
    const example1 = [
        { id: 123, name: "aaa" },
        { id: 123, name: "aaa" },
        { id: 123, name: "bbb" },
        { id: 5456, name: "zxc" }
    ];

    let example1Result = example1.reduce(function(acc, current) {
        if (acc.findIndex(({ id }) => id === current.id) === -1) {
            acc.push(current);
        }
        return acc;
    }, []);
   
    //2. filter + findIndex를 이용
    const example3 = [
        { id: 123, name: "aaa" },
        { id: 123, name: "aaa" },
        { id: 123, name: "bbb" },
        { id: 5456, name: "zxc" }
    ];
    
    let example3Result = example3.filter((item, i) => {
        return (
            example3.findIndex((item2, j) => {
                return item.id === item2.id;
            }) === i
        );
    });
            
    // 2-2. filter만 이용하기 
    // filter에는 3번째 인자로 callback 함수가 들어간다.
    let example3_1 = example3.filter(
        (arr, index, callback) => index === callback.findIndex(t => t.id === arr.id)
    );
   
    //3. Set을 이용하기. 
    //Set은 객체가 전부 같은 것만 중복제거를 한다. id == id && name == name   
    const example3 = [
        { id: 123, name: "aaa" },
        { id: 123, name: "aaa" },
        { id: 123, name: "bbb" },
        { id: 5456, name: "zxc" }
    ];
    
    console.log([...new Set(example3.map(JSON.stringify))].map(JSON.parse));
    //결과 [ { id: 123, name: "aaa" },{ id: 123, name: "bbb" },{ id: 5456, name: "zxc" }]

 

json array내 특정 key 및 조건으로 중복제거하기

let origin =[
    {"masterCd":"K1", "bitCode":"TK", "showYn":"Y", "displayYn1":"Y", "displayYn2":"Y"}
    , {"masterCd":"C1", "bitCode":"KE", "showYn":"Y", "displayYn1":"Y", "displayYn2":"N"}
    , {"masterCd":"D2", "bitCode":"KIX", "showYn":"Y", "displayYn1":"Y", "displayYn2":"N"}
    , {"masterCd":"F3", "bitCode":"ICN", "showYn":"Y", "displayYn1":"Y", "displayYn2":"Y"}
    , {"masterCd":"I7", "bitCode":"PO", "showYn":"Y", "displayYn1":"Y", "displayYn2":"Y"}
    , {"masterCd":"K1", "bitCode":"TK", "showYn":"N", "displayYn1":"Y", "displayYn2":"N"}
]

let target = [
    {"masterCd":"K1", "bitCode":"TK", "showYn":"Y", "displayYn1":"Y", "displayYn2":"Y"}
]

console.log("==== reduce 사용 ====");

let uniqueRows = origin.reduce((acc, current) => {
    const isDuplicate = acc.find(item => item.masterCd === current.masterCd && item.bitCode === current.bitCode);
    if (!isDuplicate) {
        acc.push(current);
    }
    return acc;
}, []);

console.log("결과1");
console.log(uniqueRows);


console.log("==== object key 조합 중복체크 사용 ====");


// 중복을 체크할 객체 생성
let uniqueCheck = {};

// 중복을 제거한 새로운 배열 생성
let uniqueRows2 = origin.filter(item => {
    const key = item.masterCd + '|' + item.bitCode;
    if (!uniqueCheck[key]) {
        uniqueCheck[key] = true;
        return true;
    }
    return false;
});

console.log("결과2");
console.log(uniqueRows2);


console.log("==== new Set() 사용 ====");

// 중복을 체크할 Set 생성
let uniqueCheck2 = new Set();

// 중복을 제거한 새로운 배열 생성
let uniqueRows3 = origin.filter(item => {
    const key = item.masterCd + '|' + item.bitCode;
    if (!uniqueCheck2.has(key)) {
        uniqueCheck2.add(key);
        return true;
    }
    return false;
});

console.log("결과3");
console.log(uniqueRows3);


console.log("==== 원본 json에 target json을 비교하여 중복인것 표시하기 ====");

let result = origin;

result.forEach(row => {
    let isDuplicate = target.some(
        targetRow => targetRow.masterCd === row.masterCd && targetRow.bitCode === row.bitCode
    );
    row.flag = isDuplicate ? "DELETE" : "";


});

console.log("결과4");
console.log(result);
반응형