ES6 Массив деструктурировать и присвоить объекту без функций - PullRequest
0 голосов
/ 04 декабря 2018

Мне было интересно, возможен ли этот предварительный код без map, reduce или каких-либо других функций?

const arr1 = ['str', 'str2'];
let obj = {};
Object.assign(obj, [...arr1] : 'Value');
console.log(obj); // Expected output: { str1: 'Value', str2: 'Value' }

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

Ответы [ 3 ]

0 голосов
/ 04 декабря 2018

Вы можете использовать новый Object.fromEntries, если хотите:

var obj = Object.fromEntries(arr.map(str => [str, "Value"]));

Обратите внимание, что это довольно новое и может потребоваться заполнение.

0 голосов
/ 04 декабря 2018

Невозможно распространить значение и получить объект с этим элементом в качестве ключа и другим значением.

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

const arr1 = ['str', 'str2'];

arr1[Symbol.iterator] = function* () {
    for (let i = 0; i < this.length; i++) yield { [this[i]]: 'Value' };
};

let obj = {};

Object.assign(obj, ...arr1);

console.log(obj);
0 голосов
/ 04 декабря 2018

Вы не можете распространять элементы массива, чтобы использовать их в качестве имен свойств для отдельных свойств в подобном объекте.

Самый простой способ сделать это - просто использовать цикл после факта:

let obj = {};
for (const str of arr1) {
    obj[str] = 'Value';
}

Live Пример:

const arr1 = ['str', 'str2'];
let obj = {};
for (const str of arr1) {
    obj[str] = 'Value';
}
console.log(obj); // Expected output: { str1: 'Value', str2: 'Value' }

Но если вы хотите стать "любителем", вы можете использовать Object.assign и несколько временных объектов, используя обозначение спреда, map и стрелкуфункция:

let obj = {};
Object.assign(obj, ...arr1.map(str => ({[str]: 'Value'})));

См. также ответ Джареда Смита с использованием fromEntries, который очень похож на эту assign версию, но, вероятно, немного более эффективен (все еще создает много ненужноговременных объектов, но обрабатывает эти объекты более эффективно).

Live Пример:

const arr1 = ['str', 'str2'];
let obj = {};
Object.assign(obj, ...arr1.map(str => ({[str]: 'Value'})));
console.log(obj); // Expected output: { str1: 'Value', str2: 'Value' }

Вы также можете вставить его в reduce, если хотите (потому что почти любая операция с массивом может быть вставлена ​​в reduce):

let obj = arr1.reduce((o, str) => {
    o[str] = 'Value';
    return o;
}, {});

Live Пример:

const arr1 = ['str', 'str2'];
let obj = arr1.reduce((o, str) => {
    o[str] = 'Value';
    return o;
}, {});
console.log(obj); // Expected output: { str1: 'Value', str2: 'Value' }

И затем, возможно, (ab), используя оператор запятой, чтобы функция стрелки могла использовать краткое тело:

let obj = arr1.reduce((o, str) => (o[str] = 'Value', o), {});

Live Пример:

const arr1 = ['str', 'str2'];
let obj = arr1.reduce((o, str) => (o[str] = 'Value', o), {});
console.log(obj); // Expected output: { str1: 'Value', str2: 'Value' }

Я бы все упростил и использовал цикл.: -)

...