가공전 : [{ 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개의 좋아요
답변 감사합니다!
혹시 price 키값으로 데이터 타입을 숫자로 사용하시는 분은 String 생성자 함수를 제거해서 사용하시면 됩니다. ^^
lodash로 작성해봤습니다. 
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개의 좋아요