[질문] JSON 안의 특정 Key 값을 기준으로 값을 합치는 방법

가공전 : [{ price:“2”, name: “바나나”, ref:“A” }, { price:“20”, name: “토마토”, ref:“B” }, { price:“23”, name: “수박”, ref:“C” }, { price:“23”, name: “바나나”, ref:“A” }];
가공후 : [{ price:“25”, name: “바나나”, ref:“A” }, { price:“20”, name: “토마토”,ref:“B” }, { price:“23”, name: “수박”, ref:“C” } }];

안녕하세요. 자바스크립트 포럼에 처음으로 질문을 남깁니다. ^^
위 코드를 기준으로 “ref” 값이 같으면, 해당 값의 price를 합치는 결과를 만들고 싶은데, 어떻게 작업을 해야할지 문의 드립니다. ^^

const unique = items => {
  const uniqued = items
    .reduce((acc, curr) => {
      const {price, name, ref} = curr;
      const prev = acc[ref];
      const next = prev
        ? { name, price: String(Number(prev.price) + Number(price)) }
        : { name, price }
      return { ...acc, [ref]: next }
    }, {});
  return Object.entries(uniqued)
    .map(([ref, {price, name}]) => ({ref, price, name}))
}

const result = unique([
  { price:"2", name: "바나나", ref:"A" },
  { price:"20", name: "토마토", ref:"B" },
  { price:"23", name: "수박", ref:"C" },
  { price:"23", name: "바나나", ref:"A" }
]);

// result
// [
//   { ref: 'A', price: '25', name: '바나나' },
//   { ref: 'B', price: '20', name: '토마토' },
//   { ref: 'C', price: '23', name: '수박' }
// ]
1 Like

답변 감사합니다!
혹시 price 키값으로 데이터 타입을 숫자로 사용하시는 분은 String 생성자 함수를 제거해서 사용하시면 됩니다. ^^

lodash로 작성해봤습니다. :slight_smile:

const prev = [{ price:2, name: "바나나", ref:"A" }, { price:20, name: "토마토", ref:"B" }, { price:23, name: "수박", ref:"C" }, { price:23, name: "바나나", ref:"A" }];

const result = _.chain(prev)
  .groupBy('ref')
  .values()
  .map( i => _.reduce( i, (r,v) => ({...v, price: r.price + v.price}), {price:0}))
  .value();
1 Like