I'm struggling with something that seems like it should be trivial. I have an array of objects:
const vehicles = [
{
"sku": "1234",
"year": "2004",
"make": "Chevrolet",
"model": "Avalanche",
},
{
"sku": "1234",
"year": "2006",
"make": "Chevrolet",
"model": "Avalanche",
},
{
"sku": "1234",
"year": "2009",
"make": "Chevrolet",
"model": "Silverado 1500",
},
{
"sku": "1234",
"year": "2006",
"make": "Chevrolet",
"model": "Silverado 1500",
}]
I would like to match on sku, make, and model and flatten the objects to have a final state of:
const mutatedVehicles = [
{
"sku": "1234",
"years": ["2004", "2006"],
"make": "Chevrolet",
"model": "Avalanche",
},
{
"sku": "1234",
"years": ["2009", "2006"],
"make": "Chevrolet",
"model": "Silverado 1500"
}]
I've actually worked with this in Python initially using dictionaries, but ultimately prefer some of the methods available in JS. I've tried using Array.forEach, Object.assign, and a few other methods and have come up short.
EDIT: I was asked to share some of the code I had tried - it's Python, not JS, as that's where I initially started.
def match_props(f, x):
if f['sku'] == x['sku'] and f['year'] != x['year'] and f['make'] == x['make'] and f['model'] == x['model']:
return True
else:
return False
fitments = [
{
"sku": "1234",
"year": "2004",
"make": "Chevrolet",
"model": "Avalanche",
"drive": "",
},
{
"sku": "1234",
"year": "2009",
"make": "Chevrolet",
"model": "Silverado 1500",
"drive": "",
},
{
"sku": "1234",
"year": "2006",
"make": "Chevrolet",
"model": "Silverado 1500",
"drive": "",
},
]
merged = []
for f1 in fitments:
pMerge = {}
for f2 in fitments:
if match_props(f1, f2):
pMerge = {
"sku": f1['sku'],
"make": f1['make'],
"model": f1['model'],
"drive": f1['drive'],
"years": [y for y in [f1['year'], f2['year']]]
}
else:
pMerge = f2
if pMerge not in merged:
merged.append(pMerge)
print(merged)