Вы не можете распространять элементы массива, чтобы использовать их в качестве имен свойств для отдельных свойств в подобном объекте.
Самый простой способ сделать это - просто использовать цикл после факта:
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' }
Я бы все упростил и использовал цикл.: -)