장바구니 예제를 이용함
상황
sizes:array[]
의 name과 일치하는 아이템이면 해당 아이템의 quantity와 price를 더함 const server = [
{
id: 1,
sizes: [{ size: "L", name: "item", price: 1000, quantity: 1 }],
},
];
const addToCart = [
{
id: 1,
sizes: [{ size: "L", name: "item", price: 1000, quantity: 2 }],
},
{
id: 2,
sizes: [{ size: "XL", name: "item2", price: 1000, quantity: 1 }],
},
];
addToCart와 server를 비교해서 새로운 배열 만듦
const result = [
{
id: 1,
sizes: [{ size: "L", name: "item", price: 3000, quantity: 3 }],
},
{
id: 2,
sizes: [{ size: "XL", name: "item2", price: 1000, quantity: 1 }],
},
];
getIntersectionByKey
함수를 이용하여 server 데이터와 local 데이터를 비교해서 겹치는 아이가 있는지 찾는다. curry2
의 경우 인자가 두 개 이상인 경우 사용할 수 있는 것 같다(정확히 파악 못 함)
fxjs의 intersectionWith
으로 중복 아이템을 찾는다.
intersectionWith
사용하지 않으면 아래와 같이 사용가능
getTupleByKey
함수를 사용하여 튜플로 만든다 getTupleByKey
함수는 인자로 넘어온 key로 인덱싱된 객체를 사용하여 튜플을 리턴한다. 지금까지 결과, 이중배열의 첫번째 배열이 서버, 두번째 배열이 로컬이다.
이제 getAddedSizesQuantity
라는 함수를 만들어서 같은 size끼리 quantity, price를 더한다.
getAddedSizesQuantity
함수는 살짝 복잡하다. addSizesQuantity
를 map을 돌린다. addSizesQuantity
는 로컬, 서버 데이터에 있는 sizes 배열을 가지고 key가 겹치는 데이터를 찾는 것이다. 처음 했던 일과 동일sumOfProperites
함수를 실행한다. getMerged
는 합친 sizes 배열을 서버 데이터와 합치는 함수다. sumOfProperites
는 object의 property의 숫자란 숫자란 숫자를 다 더하는 함수다. getMerged
함수로 서버 데이터의 sizes와 합쳐주면 된다. getMerged
는 튜플을 받아서 서버 데이터만 뽑고, sizes와 합친 뒤 map을 이용하여 sizes를 합치는 함수다. 따단~! 머리 터지겠다 오늘은 쉬어야지..
큰도움 @최준