Объединение объектов на основе нескольких совпадающих ключей - Javascript - PullRequest
0 голосов
/ 02 октября 2018

Я борюсь с чем-то, что кажется тривиальным.У меня есть массив объектов:

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

Я бы хотел сопоставить sku, make и model и выровнять объекты, чтобы получить конечное состояние:

const mutatedVehicles = [
  {
    "sku": "1234",
    "years": ["2004", "2006"],
    "make": "Chevrolet",
    "model": "Avalanche",
  },
  {
    "sku": "1234",
    "years": ["2009", "2006"],
    "make": "Chevrolet",
    "model": "Silverado 1500"
  }]

Я фактически работал с этим в Python, первоначально используя словари, но в конечном итоге предпочел некоторые из методов, доступных в JS.Я пытался использовать Array.forEach, Object.assign и несколько других методов, но у меня не получилось.

EDIT : меня попросили поделиться некоторыми кодами, которые я пробовал- это 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)

Ответы [ 2 ]

0 голосов
/ 02 октября 2018

Хотя этот ответ совпадает с ответом от Нихила Аггарвала, его достаточно, чтобы показать это.Вместо того, чтобы фиксировать ключевые поля, он фокусируется на тех (здесь просто year, но было бы легко распространяться на другие), которые имеют несколько значений.

const collect = (vehicles) => Object.values(vehicles.reduce((vs, v) => {
  const {year, ...veh} = v
  const key = JSON.stringify(veh);
  const vehicle = vs[key] || (vs[key] = {years: [], ...veh})
  vehicle.years.push(year)
  return vs
}, {}))

const vehicles = [{"make": "Chevrolet", "model": "Avalanche", "sku": "1234", "year": "2004"}, {"make": "Chevrolet", "model": "Avalanche", "sku": "1234", "year": "2006"}, {"make": "Chevrolet", "model": "Silverado 1500", "sku": "1234", "year": "2009"}, {"make": "Chevrolet", "model": "Silverado 1500", "sku": "1234", "year": "2006"}]

console.log(collect(vehicles))
0 голосов
/ 02 октября 2018

Использование Array.reduce и Object.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);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...