Last active
April 12, 2018 10:41
-
-
Save yuanoook/2b8ccecca2ded8f6f0e5b34a513251ac to your computer and use it in GitHub Desktop.
merge_products_with_same_id_and_same_grouped_addons.js
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
function merge_products_with_same_id_and_same_grouped_addons(products) { | |
var grouped_products_map_by_same_id_and_same_grouped_addons = {} | |
var generate_hash_key_for_grouped_addons = function(addons) { | |
if (!addons || !addons.sort) return '' | |
addons.sort(function(addon1, addon2){ return addon1.id > addon2.id ? 1 : -1}) | |
return JSON.stringify(addons) | |
} | |
var generate_hash_key_for_product = function(product) { | |
var product_grouped_addons_hash = generate_hash_key_for_grouped_addons(product.grouped_addons) | |
var hash_key = product.id + product_grouped_addons_hash | |
return hash_key | |
} | |
products.forEach(function(product) { | |
let hash_key = generate_hash_key_for_product(product) | |
let group = grouped_products_map_by_same_id_and_same_grouped_addons[hash_key] || [] | |
group.push(product) | |
grouped_products_map_by_same_id_and_same_grouped_addons[hash_key] = group | |
}); | |
var clone = function(obj) { | |
return JSON.parse(JSON.stringify(obj)) | |
} | |
var merge_products = function(products) { | |
var last_product = products[products.length-1] | |
var last_grouped_addons = last_product.grouped_addons | |
var total_price = products.reduce(function(prev, product) { | |
return prev + (Number(product.price) || 0) | |
}, 0) | |
var result = clone(last_product) | |
result.price = total_price | |
return result | |
} | |
var result = Object.keys(grouped_products_map_by_same_id_and_same_grouped_addons).map(function(key) { | |
let group_products = grouped_products_map_by_same_id_and_same_grouped_addons[key] | |
return merge_products(group_products) | |
}) | |
return result | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment