基于多个匹配键合并对象 - Javascript

Smi*_*tty 1 javascript arrays object

我正在努力寻找看起来应该是微不足道的事情.我有一个对象数组:

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",
}]
Run Code Online (Sandbox Code Playgroud)

我想匹配sku,make以及model和扁平的对象有一个最终状态:

const mutatedVehicles = [
  {
    "sku": "1234",
    "years": ["2004", "2006"],
    "make": "Chevrolet",
    "model": "Avalanche",
  },
  {
    "sku": "1234",
    "years": ["2009", "2006"],
    "make": "Chevrolet",
    "model": "Silverado 1500"
  }]
Run Code Online (Sandbox Code Playgroud)

我最初使用字典在Python中使用过这个,但最终更喜欢JS中的一些方法.我已经尝试过使用Array.forEach,Object.assign和其他一些方法,而且还很简单.

编辑:我被要求分享我尝试过的一些代码 - 它是Python,而不是JS,因为那是我最初开始的地方.

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)
Run Code Online (Sandbox Code Playgroud)

Nik*_*wal 5

使用Array.reduceObject.values

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"}];

let result = Object.values(vehicles.reduce((a,{sku, year, make, model}) => {
  let id = sku + "_" + make + "_" + model;
  if(a[id]) a[id].years.push(year)
  else a[id] = {sku, make, model, years : [year]}
  return a;
},{}));

console.log(result);
Run Code Online (Sandbox Code Playgroud)