Skip to content

Instantly share code, notes, and snippets.

Show Gist options
  • Save yuanoook/2b8ccecca2ded8f6f0e5b34a513251ac to your computer and use it in GitHub Desktop.
Save yuanoook/2b8ccecca2ded8f6f0e5b34a513251ac to your computer and use it in GitHub Desktop.
merge_products_with_same_id_and_same_grouped_addons.js
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