{"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 (reduce)","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 (for...of)","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 = (existing.options ?? []).concat(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\nconsolidateCartItems(body)","IsDeferred":false},{"Name":"lodash ","Code":"function consolidateCartItems({ items }) {\r\n const grouped = _.groupBy(items, \u0027goodsCode\u0027);\r\n\r\n return Object.entries(grouped).map(([goodsCode, group]) =\u003E {\r\n const totalQuantity = _.sumBy(group, \u0027quantity\u0027);\r\n\r\n const allOptions = group.flatMap((item) =\u003E item.options ?? []);\r\n const mergedOptions = allOptions.length \u003E 0 ? consolidateCartItems({ items: allOptions }) : undefined;\r\n\r\n const result = { goodsCode, quantity: totalQuantity };\r\n if (mergedOptions?.length) result.options = mergedOptions;\r\n\r\n return result;\r\n });\r\n}\r\n \r\nconsolidateCartItems(body)","IsDeferred":false},{"Name":"lodash (chain)","Code":"function consolidateCartItems({ items }) {\r\n return (\r\n _.chain(items)\r\n .groupBy(\u0027goodsCode\u0027)\r\n .map((group, goodsCode) =\u003E {\r\n const quantity = _.sumBy(group, \u0027quantity\u0027);\r\n\r\n const mergedOptions = _.chain(group)\r\n .flatMap(\u0027options\u0027)\r\n .filter(Boolean)\r\n .thru((opts) =\u003E\r\n opts.length \u003E 0\r\n ? consolidateCartItems({ items: opts })\r\n : undefined,\r\n )\r\n .value();\r\n\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}]}