{"ScriptPreparationCode":"var body = {\r\n items: [\r\n {\r\n goodsCode: \u0027A\u0027,\r\n quantity: 1,\r\n options: [\r\n {\r\n goodsCode: \u0027X\u0027,\r\n quantity: 1,\r\n options: [\r\n {\r\n goodsCode: \u0027Z\u0027,\r\n quantity: 2,\r\n },\r\n ],\r\n },\r\n ],\r\n },\r\n {\r\n goodsCode: \u0027A\u0027,\r\n quantity: 2,\r\n options: [\r\n {\r\n goodsCode: \u0027X\u0027,\r\n quantity: 2,\r\n options: [\r\n {\r\n goodsCode: \u0027Z\u0027,\r\n quantity: 3,\r\n },\r\n ],\r\n },\r\n ],\r\n },\r\n ],\r\n }","TestCases":[{"Name":"Map","Code":"function consolidateCartItems({ items }) {\r\n const uniqItemsMap = items.reduce((acc, item) =\u003E {\r\n const prevItem = acc.get(item.goodsCode);\r\n if (prevItem) {\r\n const options = (prevItem.options ?? []).concat(item?.options ?? []);\r\n const hasOptions = options.length \u003E 0;\r\n const newItem = {\r\n ...prevItem,\r\n quantity: prevItem.quantity \u002B item.quantity,\r\n };\r\n\r\n if (hasOptions) {\r\n newItem.options = consolidateCartItems({ items: options });\r\n }\r\n acc.set(item.goodsCode, newItem);\r\n } else {\r\n acc.set(item.goodsCode, item);\r\n }\r\n return acc;\r\n }, new Map());\r\n\r\n return [...uniqItemsMap.values()];\r\n }\r\n\r\nconsolidateCartItems(body)","IsDeferred":false},{"Name":"Map - v2","Code":"function consolidateCartItems({ items }) {\r\n const map = new Map();\r\n\r\n for (const item of items) {\r\n const key = item.goodsCode;\r\n const existing = map.get(key);\r\n\r\n if (existing) {\r\n existing.quantity \u002B= item.quantity;\r\n\r\n const mergedOptions = mergeOptions(existing.options ?? [], item.options ?? []);\r\n if (mergedOptions.length \u003E 0) {\r\n existing.options = consolidateCartItems({ items: mergedOptions });\r\n }\r\n } else {\r\n map.set(key, { ...item });\r\n }\r\n }\r\n\r\n return [...map.values()];\r\n}\r\n\r\nfunction mergeOptions(a, b) {\r\n return [...a, ...b];\r\n}\r\n \r\nconsolidateCartItems(body)","IsDeferred":false},{"Name":"lodash","Code":"function consolidateCartItems({ items }) {\r\n return (\r\n _.chain(items)\r\n // goodsCode\uB97C \uAE30\uC900\uC73C\uB85C \uADF8\uB8F9\uD654\r\n .groupBy(\u0027goodsCode\u0027)\r\n .map((group, goodsCode) =\u003E {\r\n // \uADF8\uB8F9 \uB0B4 \uC804\uCCB4 \uC218\uB7C9 \uD569\uC0B0\r\n const quantity = _.sumBy(group, \u0027quantity\u0027);\r\n\r\n // \uC635\uC158\uB4E4\uC744 \uD55C \uACF3\uC5D0 \uBAA8\uC740 \uD6C4 \uC874\uC7AC \uC5EC\uBD80 \uD655\uC778\r\n const mergedOptions = _.chain(group)\r\n .flatMap(\u0027options\u0027) // \uBAA8\uB4E0 \uC635\uC158\uC744 \uD3C9\uD0C4\uD654\r\n .filter(Boolean) // null/undefined \uD544\uD130\uB9C1\r\n .thru((opts) =\u003E\r\n opts.length \u003E 0\r\n ? consolidateCartItems({ items: opts }) // \uC7AC\uADC0 \uBCD1\uD569\r\n : undefined,\r\n )\r\n .value();\r\n\r\n // \uBCD1\uD569\uB41C \uD56D\uBAA9 \uC0DD\uC131 (\uC635\uC158\uC740 \uC788\uC744 \uACBD\uC6B0\uC5D0\uB9CC \uD3EC\uD568)\r\n return {\r\n goodsCode,\r\n quantity,\r\n ...(mergedOptions ? { options: mergedOptions } : {}),\r\n };\r\n })\r\n .value()\r\n );\r\n }\r\n \r\nconsolidateCartItems(body)","IsDeferred":false}]}