zilevsky
@zilevsky

Как объединить два объекта с одинаковыми ключами?

Добрый день.
Подскажите как объединить два объекта с одинаковыми ключами чтобы значения поместить в словарь?

На входе
active_dl: {
    "Машины и оборудование прочие, не включенные в другие группировки": 1,
    "Насосное оборудование, комлектующие, сопутствующие": 1,
    "Электродвигатели, генераторы и трансформаторы силовые": 1,
    "Средства транспортные прочие, не включенные в другие группировки": 1
},
inactive_dl: {
    "Машины и оборудование прочие, не включенные в другие группировки": 2,
    "Насосное оборудование, комлектующие, сопутствующие": 2,
    "Электродвигатели, генераторы и трансформаторы силовые": 2
}


На выходе нужно получить

all_dl: {
    "Машины и оборудование прочие, не включенные в другие группировки": {"active":1, "inactive":2},
    "Насосное оборудование, комлектующие, сопутствующие": {"active":1, "inactive":2},
    "Электродвигатели, генераторы и трансформаторы силовые": {"active":1, "inactive":2},
    "Средства транспортные прочие, не включенные в другие группировки": {"active":1, "inactive":0}
}
  • Вопрос задан
  • 106 просмотров
Решения вопроса 1
Seasle
@Seasle Куратор тега JavaScript
const keys = new Set(
  Object.values(data)
    .map((entry) => Object.keys(entry))
    .flat()
);
const properties = Object.keys(data).map((key) => [
  key.split("_").shift(),
  key,
]);

const result = [...keys].reduce((acc, key) => {
  acc[key] = Object.fromEntries(
    properties.map(([property, type]) => [property, data[type][key] ?? 0])
  );

  return acc;
}, {});

Другие варианты

const mappedData = Object.entries(data).reduce((acc, [type, entry]) => {
    const property = type.split('_').shift();
    for (const key in entry) {
        acc[key] = { ...acc[key], [property]: entry[key] };
    }
    return acc;
}, {});
console.log(mappedData);
/* 
{
    "Машины и оборудование прочие, не включенные в другие группировки": {
        "active": 1,
        "inactive": 2
    },
    "Насосное оборудование, комлектующие, сопутствующие": {
        "active": 1,
        "inactive": 2
    },
    "Электродвигатели, генераторы и трансформаторы силовые": {
        "active": 1,
        "inactive": 2
    },
    "Средства транспортные прочие, не включенные в другие группировки": {
        "active": 1
    }
}
*/

или
const result = {};
const propertyMap = Object.fromEntries(Object.keys(data).map((key) => [key.split('_').shift(), key]));
for (const property in propertyMap) {
    for (const key in data[propertyMap[property]]) {
        result[key] ??= {};
        result[key][property] = data[propertyMap[property]][key];
    }
}
for (const key in result) {
    for (const property in propertyMap) {
        if (property in result[key] === false) {
            result[key][property] = null;
        }
    }
}
console.log(result);
/*
{
    "Машины и оборудование прочие, не включенные в другие группировки": {
        "active": 1,
        "inactive": 2
    },
    "Насосное оборудование, комлектующие, сопутствующие": {
        "active": 1,
        "inactive": 2
    },
    "Электродвигатели, генераторы и трансформаторы силовые": {
        "active": 1,
        "inactive": 2
    },
    "Средства транспортные прочие, не включенные в другие группировки": {
        "active": 1,
        "inactive": null
    }
}
*/

Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы