Toggle navigation
MeasureThat.net
Create a benchmark
Tools
Feedback
FAQ
Register
Log In
lodash vs Map - v2
(version: 1)
consolidate
Comparing performance of:
Map vs Map - v2 vs lodash
Created:
one year ago
by:
Guest
Jump to the latest result
HTML Preparation code:
<script src='https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.5/lodash.min.js'></script>
Script Preparation code:
var body = { items: [ { goodsCode: 'A', quantity: 1, options: [ { goodsCode: 'X', quantity: 1, options: [ { goodsCode: 'Z', quantity: 2, }, ], }, ], }, { goodsCode: 'A', quantity: 2, options: [ { goodsCode: 'X', quantity: 2, options: [ { goodsCode: 'Z', quantity: 3, }, ], }, ], }, ], }
Tests:
Map
function consolidateCartItems({ items }) { const uniqItemsMap = items.reduce((acc, item) => { const prevItem = acc.get(item.goodsCode); if (prevItem) { const options = (prevItem.options ?? []).concat(item?.options ?? []); const hasOptions = options.length > 0; const newItem = { ...prevItem, quantity: prevItem.quantity + item.quantity, }; if (hasOptions) { newItem.options = consolidateCartItems({ items: options }); } acc.set(item.goodsCode, newItem); } else { acc.set(item.goodsCode, item); } return acc; }, new Map()); return [...uniqItemsMap.values()]; } consolidateCartItems(body)
Map - v2
function consolidateCartItems({ items }) { const map = new Map(); for (const item of items) { const key = item.goodsCode; const existing = map.get(key); if (existing) { existing.quantity += item.quantity; const mergedOptions = mergeOptions(existing.options ?? [], item.options ?? []); if (mergedOptions.length > 0) { existing.options = consolidateCartItems({ items: mergedOptions }); } } else { map.set(key, { ...item }); } } return [...map.values()]; } function mergeOptions(a, b) { return [...a, ...b]; } consolidateCartItems(body)
lodash
function consolidateCartItems({ items }) { return ( _.chain(items) // goodsCode를 기준으로 그룹화 .groupBy('goodsCode') .map((group, goodsCode) => { // 그룹 내 전체 수량 합산 const quantity = _.sumBy(group, 'quantity'); // 옵션들을 한 곳에 모은 후 존재 여부 확인 const mergedOptions = _.chain(group) .flatMap('options') // 모든 옵션을 평탄화 .filter(Boolean) // null/undefined 필터링 .thru((opts) => opts.length > 0 ? consolidateCartItems({ items: opts }) // 재귀 병합 : undefined, ) .value(); // 병합된 항목 생성 (옵션은 있을 경우에만 포함) return { goodsCode, quantity, ...(mergedOptions ? { options: mergedOptions } : {}), }; }) .value() ); } consolidateCartItems(body)
Rendered benchmark preparation results:
Suite status:
<idle, ready to run>
Run tests (3)
Previous results
Fork
Test case name
Result
Map
Map - v2
lodash
Fastest:
N/A
Slowest:
N/A
Latest run results:
Run details:
(Test run date:
one year ago
)
User agent:
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/135.0.0.0 Safari/537.36
Browser/OS:
Chrome 135 on Mac OS X 10.15.7
View result in a separate tab
Embed
Embed Benchmark Result
Test name
Executions per second
Map
4115513.0 Ops/sec
Map - v2
5582452.0 Ops/sec
lodash
559473.6 Ops/sec
Related benchmarks:
Test Immutable ToJS vs get
Test Immutable ToJS vs single get
Merge array test
Lodash Vanilla vs Lodash FP
Lodash Vanilla (+ Chained) vs Lodash FP vs Native
Spread vs if/else vs switch/break
Options
lodash vs Map
multi-order consolidateCartItems lodash vs Map
Comments
Confirm delete:
Do you really want to delete benchmark?