Создать объект из массива

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

var dynamicArray = ["2007", "2008", "2009", "2010"];

и с некоторым javascript es6 я хочу создать такой объект:

const obj = {
    2007: {
        x: width / 5,
        y: height / 2
    },
    2008: {
        x: (2 / 5) * width,
        y: height / 2
    },
    2009: {
        x: (3 / 5) * width,
        y: height / 2
    },
    2010: {
        x: (4 / 5) * width,
        y: height / 2
    }
}

не беспокойтесь о внутренних объектах, а просто хотите создать структуру вроде этого:

 obj = {
      2007: ...,
      2008: ...,
      ...
    }

Пожалуйста, помогите, спасибо.

Ответ 1

Просто

 const obj = {};

 for (const key of yourArray) {
      obj[key] = whatever;
 }

или если вы предпочитаете "функциональный" стиль:

 const obj = yourArray.reduce((o, key) => Object.assign(o, {[key]: whatever}), {});

используя современный оператор распространения объектов:

const obj = yourArray.reduce((o, key) => ({ ...o, [key]: whatever}), {})

Пример:

[
  { id: 10, color: "red" },
  { id: 20, color: "blue" },
  { id: 30, color: "green" }
].reduce((acc, cur) => ({ ...acc, [cur.color]: cur.id }), {})

Вывод:

{red: 10, blue: 20, green: 30}

Вот как это работает:

reduce инициализируется пустым объектом (пустой {} в конце), поэтому первые итерационные переменные являются acc = {} cur = { id: 10, color: "red" }. Функция возвращает объект - вот почему тело функции завернуто в круглые скобки => ({... }). Оператор распространения не делает ничего на первой итерации, поэтому red: 10 устанавливается как первый элемент.

На вторых итерационных переменных: acc = { red: 10 } cur = { id: 20, color: "blue" }. Здесь оператор с расширением расширяет acc и функция возвращает { red: 10, blue: 20 }.

Третья итерация acc = { red: 10, blue: 20 } cur = { id: 30, color: "green" }, поэтому, когда acc распространяется внутри объекта, наша функция возвращает окончательное значение.

Ответ 2

в js с es6 уменьшить функцию для массива Я делаю это так

let x = [1,2,3]
let y = x.reduce((acc, elem) => {
  acc[elem] = elem // or what ever object you want inside
  return acc
}, {})
console.log(y) // {1:1, 2:2, 3:3}

Ответ 3

Новый Object.fromEntries, из ECMAScript 2019, делает еще проще преобразовать значения из массива в ключи в объекте, как показано ниже

const dynamicArray = ["2007", "2008", "2009", "2010"];
const obj = Object.fromEntries(
  dynamicArray.map(year => [year, {
    something: "based",
    on: year
  }])
)

console.log(obj)

Ответ 4

вы можете использовать:

     dynamicArray.map(value => ({'key': value, 'val': 'whatever you want'}));

enter image description here