#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; }