Сведение массива объектов к карте значения ключа

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

const drinks = [
  { _id: "5fe40ad4d2e6e6de85c46a6c", name: "Americano", __v: 0 },
  { _id: "5fe40ad4d2e6e6de85c46a6d", name: "Latte", __v: 0 },
  { _id: "5fe40ad4d2e6e6de85c46a6e", name: "Flat White", __v: 0 }
];

Я пробовал это, что почти работает:

console.info(drinks.reduce(
  (accumulator, currentValue) => 
     Object.assign(accumulator, accumulator[currentValue._id] = currentValue.name), {}));

Однако он выводит:

Object { 
  0: "F", 1: "l", 2: "a", 3: "t", 4: " ", 5: "W", 6: "h", 7: "i", 8: "t", 9: "e",
  5fe40ad4d2e6e6de85c46a6c: "Americano", 
  5fe40ad4d2e6e6de85c46a6d: "Latte", 
  5fe40ad4d2e6e6de85c46a6e: "Flat White" 
}

Мне нужно:

Object { 
  5fe40ad4d2e6e6de85c46a6c: "Americano", 
  5fe40ad4d2e6e6de85c46a6d: "Latte", 
  5fe40ad4d2e6e6de85c46a6e: "Flat White"
}

Почему моя функция также разбивает одно из значений на символы?

Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
1
0
67
4
Перейти к ответу Данный вопрос помечен как решенный

Ответы 4

Ответ принят как подходящий

const drinks = [{ _id: "5fe40ad4d2e6e6de85c46a6c", name: "Americano", __v: 0 },
                { _id: "5fe40ad4d2e6e6de85c46a6d", name: "Latte", __v: 0 },
                { _id: "5fe40ad4d2e6e6de85c46a6e", name: "Flat White", __v: 0 }];
                
                const result=drinks.reduce((acc,curr)=>{
                acc[curr._id]=curr.name;
                return acc;
                },{})
                
console.info(result)

Это будет работать

drinks.map(({ _id, name }) => ({
  [_id]: name
}))

Это выведет массив объектов, а не один объект...

Nick Parsons 24.12.2020 05:41

Вы можете сопоставить свой массив с массивом записей (пары ключ/значение), которые затем можно запустить через Object.fromEntries() для создания конечного объекта.

const drinks = [
  { _id: "5fe40ad4d2e6e6de85c46a6c", name: "Americano", __v: 0 },
  { _id: "5fe40ad4d2e6e6de85c46a6d", name: "Latte", __v: 0 },
  { _id: "5fe40ad4d2e6e6de85c46a6e", name: "Flat White", __v: 0 }
]
                
const result = Object.fromEntries(drinks.map(({ _id, name }) =>
  [ _id, name ]))
  
console.info(result)

Более длинная версия будет примерно такой

const result = drinks.reduce((obj, { _id, name }) => ({
  ...obj, // spread syntax is like `Object.assign()`
  [ _id ]: name // use `_id` as a dynamic object key with value `name`
}), {})

Проблема с вашим текущим кодом заключается в том, что результат...

accumulator[currentValue._id] = currentValue.name

это присвоенное значение (т.е. currentValue.name). При использовании в качестве аргумента в Object.assign() он разбивается на записи объекта, что приводит к тому, что вы видите с помощью

{ 
  0: "F", 
  1: "l", 
  2: "a", 
  3: "t", 
  4: " ", 
  5: "W", 
  6: "h", 
  7: "i", 
  8: "t", 
  9: "e"
}

Спасибо, что объяснили, что происходит!

Vlad L 24.12.2020 08:34

Просто передайте объект { [currentValue._id]: currentValue.name } в assign вместо присваивания accumulator[currentValue._id] = currentValue.name

const drinks = [
  { _id: "5fe40ad4d2e6e6de85c46a6c", name: "Americano", __v: 0 },
  { _id: "5fe40ad4d2e6e6de85c46a6d", name: "Latte", __v: 0 },
  { _id: "5fe40ad4d2e6e6de85c46a6e", name: "Flat White", __v: 0 }
];

console.info(drinks.reduce(
  (accumulator, currentValue) => 
     Object.assign(accumulator, { [currentValue._id]: currentValue.name }), {}));

Спасибо, это ближе всего к тому, что я пытался достичь

Vlad L 24.12.2020 08:29

Другие вопросы по теме