Проблема
Скажем, у нас есть массив значений:
const values = [ 10, 20, 30 ];
Скажем, у нас есть объект, который мы хотим получить эти значения:
let props = {
"hello": null,
"world": null,
"other": null
};
Я мог бы просто сделать это:
props.hello = values[0];
props.world = values[1];
props.other = values[2];
Таким образом, мы бы получили желаемый результат:
console.log(props.hello); // Result: 10
console.log(props.world); // Result: 20
console.log(props.other); // Result: 30
Или, точнее:
console.log(props);
// Result:
// {
// "hello": 10,
// "world": 20,
// "other": 30
// }
Проблема в том, что я не всегда знаю, какими должны быть имена свойств.
Предположим, props
- это существующий, но пустой объект (или, если он содержит свойства, они не связаны с тем, что мы Вы делаете здесь).
props = {};
И предположим, что мы хотим вычислить имя каждого свойства из некоторого связанного значения.
Как мне заполнить props
именами и значениями, которые я хотите?
Одно решение
Так что я мог бы сделать это вместо этого, сократив массив имен до объекта и затем присвоив свойства этого объекта обратно исходному объекту:
const names = [ "hello", "world", "other" ];
const newProps = names.reduce((p, c, i) => {
p[c] = values[i];
return p;
}, {});
props = Object.assign({}, props, newProps);
Но это кажется грязным. Например, предполагается, что для каждого i
, существующего в values
, эквивалент будет существовать для names
.
Вопрос
Есть ли способ сделать это с помощью задания по деструктуризации ?
Да, если я заранее знаю имена свойств:
[ props.hello, props.world, props.other ] = values;
Но что, если имена существуют отдельно или их необходимо вычислить, прежде чем они могут быть присвоены props
объект?
let props = {};
const values = [ 10, 20, 30 ];
const names = [ "hello", "world", "other" ];
// [ ...props??? ] = values;
//
// Desired result (props):
// {
// "hello": 10,
// "world": 20,
// "other": 30
// }
Еще одна вещь: причина, по которой я заинтересован в деструктурировании, помимо краткости формы, состоит в том, что я хотел бы, чтобы names
и values
были рассмотрены «неизменный» однажды объявил. Объект props
в идеале был бы единственным изменяющимся состоянием в коде. (Я намекнул на это, объявив names
и values
с const
и props
с let
, хотя я знаю, что на практике эти объявления не останавливают изменения содержимого объектов и массивов .)