Уничтожить массив JavaScript для вычисляемых имен свойств существующего объекта - PullRequest
0 голосов
/ 23 февраля 2020

Проблема

Скажем, у нас есть массив значений:

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, хотя я знаю, что на практике эти объявления не останавливают изменения содержимого объектов и массивов .)

Ответы [ 2 ]

3 голосов
/ 23 февраля 2020

Вы можете повторять имена и значения одновременно для назначения.

let values = [10, 20, 30],
    props = {},
    names = ["hello", "world", "other"];

for (props[names.shift()] of values) ;

console.log(props);

Еще одно мыслимое решение, но с жестко закодированной ссылкой на объект.

let values = [10, 20, 30],
    props = {},
    names = ["hello", "world", "other"];

[props[names.shift()], props[names.shift()], props[names.shift()]] = values;

console.log(props);
0 голосов
/ 23 февраля 2020

Ожидаемый результат может быть получен следующим образом:

let values = [ 10, 20, 30 ];
let names = [ "hello", "world", "other" ];
let props = {};

names.forEach((name, index) => props[name] = values[index]);
console.log(props);
...