У меня есть массив строк, и я хочу превратить его в объект, где каждый ключ - это слово. Я делаю это:
let arr = ['a', 'b', 'c']; let obj = {}; obj[...arr] = true;
Однако, похоже, это не работает: (
Кто-нибудь знает, что я делаю не так?
Вы можете использовать функцию reduce, чтобы заполнить obj истинными значениями
reduce
obj
const arr = ['a', 'b', 'c']; const obj = arr.reduce((acc, val) => { acc[val] = true; return acc; }, {}); console.log(obj);
Вы можете использовать Array.prototype.reduce() чуть более кратко:
Array.prototype.reduce()
const fill = v => (o, k) => ({ ...o, [k]: v }) let arr = ['a', 'b', 'c'] let obj = arr.reduce(fill(true), {}) console.log(obj)
Если вам действительно не нравится копировать аккумулятор o каждую итерацию, вы можете использовать Object.assign() вместо:
o
Object.assign()
const fill = v => (o, k) => Object.assign(o, { [k]: v }) let arr = ['a', 'b', 'c'] let obj = arr.reduce(fill(true), {}) console.log(obj)
Или даже просто
const fill = v => k => ({ [k]: v }) let arr = ['a', 'b', 'c'] let obj = Object.assign(...arr.map(fill(true))) console.log(obj)
Использование forEach короче.
forEach
let arr = ['a', 'b', 'c']; var obj = {} arr.forEach(e=>obj[e]=true) console.log(obj)
Но вы можете использовать Array.prototype.reduce () , что, вероятно, быстрее.
let arr = ['a', 'b', 'c']; var obj = arr.reduce((acc,c,i)=>{ acc[c] = true; return acc; },{}) console.log(obj)
Для обратного вы можете использовать синтаксис распространения :
var obj = { "a": true, "b": true, "c": true } var arr = [...Object.keys(obj)]; console.log(arr)
Для синтаксиса распространения требуется итерация, например, массив, но это может быть объект, см. Это по протоколам итерации . В приведенном выше случае мы используем Object.keys(obj), который возвращает массив.
Object.keys(obj)