Объединение значений из нескольких объектов с помощью ключа на основе значений массива — Javascript

#javascript #arrays #object

Вопрос:

Мне нужно создать новый объект с ключами и значениями на основе массива ключей из другого объекта. У меня есть два объекта со следующей структурой:

 const parentObject = {P1:['C1','C2','C3','C4'], P2:['C5','C6']};

const values = {C1: "value", C2: "value", C3: "value",C4: "value", C5: "value",C6: "value"}
 

Результат, которого я ожидаю, таков:

     const result = {P1: {C1: "value", C2: "value", C3: "value", C4: "value"}, 
                    P2: {C5: "value",C6: "value"}}
 

Что я пытался:

  let result = {}

    Object.entries(parentObject).map(([key, value]) => {
      value.map(i => {
        let keysAndValues = { [key]: { [i]: values[i] } };
        result = Object.assign(keysAndValues)
      })
    })
 

Результатом моего кода является только последний родитель и значение, но мне нужны все они.

Ключи и значения являются результатом работы базы данных, поэтому она постоянно меняется.

Комментарии:

1. Ты имеешь в виду {P1:['C1','C2','C3','C4'], P2:['C5','C6']} ?

2. Да! извините, я отредактирую. Спасибо

3. const result = Object.fromEntries(Object.entries(parentObject).map(([key, value]) => [key, value.reduce((p, c) => (p[c] = values[c], p), {})]));

4. @ASDFGerte Это Сработало! Спасибо.

Ответ №1:

Вы можете использовать

 const parentObject = {P1:['C1','C2','C3','C4'], P2:['C5','C6']};
const values = {C1: "value", C2: "value", C3: "value",C4: "value", C5: "value",C6: "value"}

const result = Object.fromEntries(
  Object.entries(parentObject)
    .map(([key, value]) => [
      key,
      value.reduce((p, c) => (p[c] = values[c], p), {})
    ])
);

console.log(result); 

В качестве примечания, в глобальной области devtool уже есть values (также в браузерах, отличных от chrome, например, FF), которые будут конфликтовать, но нет никаких проблем, если они находятся в какой-либо другой области или просто не в консоли, что, вероятно, относится к вам.

Ответ №2:

Вы можете взять рекурсивную функцию, которая работает с массивом, объектами и просто промитивом для получения значения.

 const
    fill = pattern => Array.isArray(pattern)
        ? pattern.map(fill)
        : pattern amp;amp; typeof pattern === 'object'
            ? Object.fromEntries(Object.entries(pattern).map(([k, v]) => [k, fill(v)]))
            : values[pattern],
    pattern = { P1: ['C1', 'C2', 'C3', 'C4'], P2: ['C5', 'C6'] },
    values = { C1: "value", C2: "value", C3: "value", C4: "value", C5: "value", C6: "value" },
    result = fill(pattern);

console.log(result); 
 .as-console-wrapper { max-height: 100% !important; top: 0; }