// 초기 데이터
const data = {
  id: '',
  pwd: '',
  list: [],
};

// // 첫 번째 갱신
// rebuild3(data.list, addList1);
// console.log(data.list);

// // 두 번째 갱신
// setTimeout(() => {
//   rebuild3(data.list, addList2);
//   console.log(data.list);
// }, 2000);
const rebuild4 = (list, additionalList) => {
  let categorySeqMap = {};

  // 기존 리스트의 마지막 seq 정보 가져오기
  let lastSeqByCategory = {};
  list.forEach((item) => {
    lastSeqByCategory[item.categorycode] = item.seq;
  });


  // reduce를 사용하여 각 카테고리에 대한 마지막 seq 얻기
  let lastSeqByCategory = list.reduce((acc, item) => {
    acc[item.categorycode] = item.seq;
    return acc;
  }, {});
 

  // 갱신된 정보를 포함한 전체 목록
  let combinedList = [...list];

  // categorycode 별로 seq 순번 처리
  additionalList.forEach((item) => {
    if (!categorySeqMap[item.categorycode]) {
      categorySeqMap[item.categorycode] = lastSeqByCategory[item.categorycode] + 1 || 1;
    }
    item.seq = categorySeqMap[item.categorycode]++;
    combinedList.push(item);
  });

  // dpacode 속성 값 중복 처리
  let dpacodeMap = {};

  combinedList.forEach((item) => {
    let originalDpacode = item.dpacode;

    if (!dpacodeMap[originalDpacode]) {
      dpacodeMap[originalDpacode] = 1;
    } else {
      // 중복된 dpacode 처리
      let newDpacode = `${originalDpacode}_${dpacodeMap[originalDpacode]}`;
      dpacodeMap[originalDpacode]++;
      item.dpacode = newDpacode;
    }
  });

  // categorycode 별로 정렬
  combinedList.sort((a, b) => a.categorycode.localeCompare(b.categorycode) || a.seq - b.seq);

  // 결과를 기존 리스트에 복사
  list.length = 0;
  Array.prototype.push.apply(list, combinedList);
};

// 첫 번째 갱신
rebuild4(data.list, addList1);
console.log(data.list);

// 두 번째 갱신
setTimeout(() => {
  rebuild4(data.list, addList2);
  console.log(data.list);
}, 2000);

 

Posted by 아트민
,