Как я могу сопоставить массив или объект с объектом?

Обычно метод карта возвращает массив, но у меня было много случаев использования, когда вместо этого я хотел бы создать объект. Есть ли собственный способ JavaScript сделать это или очень простая и производительная реализация? Решения jQuery также приветствуются.

Вот как работает родной метод отображения массива (EcmaScript 6):

console.info( [ 1, 2, 4 ].map( item => item * 10) );
// => [ 10, 20, 40 ]

Вот как я представляю, как работает этот метод (в случае, если он нативный для JavaScript):

console.info( [ 1, 2, 4 ].mapToObject(resolveMultiplyWithTen) );
// => { 1: 10, 2: 20, 4: 40 }

В этом примере метод картаОбъект должен вести себя так же, как карта, но возвращать объект вместо массива. Обратный вызов разрешитьMultiplyWithTen умножит элемент на десять.

Проблема, которую я здесь вижу, заключается в том, что функция обратного вызова не может вернуть два значения (ключ и значение, например: 1 и 20), которые необходимы для эффективного создания объекта.

Вот как я всегда создавал объект из массива:

/* Loop over Array and create key:value pairs in Object */
const arr = [ 1, 2, 4];
const obj = {};
for ( let i = 0; i < arr.length; i++ )
  obj[arr[i]] = arr[i] * 10;
console.info(obj);
// => { 1: 10, 2: 20, 4: 40 }

Это самое подходящее решение, которое я мог придумать:

/* Create an Object of each item via map and apply to Object.assign */
console.info(Object.assign.apply(null, [ 1, 2, 4 ].map( item => {
  const out = {};
  out[item] = item * 10;
  return out;
})));
// => { 1: 10, 2: 20, 4: 40 }

Есть ли какое-либо собственное решение JavaScript для этой проблемы или более эффективный способ?

Учитывая массив [1, 2, 3], какими именно будут ключи для значений?

Taplar 29.05.2019 19:40

Вы можете использовать Array.prototype.reduce для преобразования массива в объект. Вам просто нужно определить, как должны быть определены ключи и значения.

Taplar 29.05.2019 19:41
I have had a lot use-cases where I would like to create an Object instead Я сомневаюсь в этих вариантах использования.
James 29.05.2019 22:36

@James Допустим, у вас есть объект и вы хотите рекурсивно изменить ключи / значения (в новый объект). В моем понимании это был бы путь.

BL4CKY 30.05.2019 15:01
Поведение ключевого слова "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) для оценки ваших знаний,...
0
4
62
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

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

Вы можете просто использовать уменьшать

let obj = [ 1, 2, 4 ].reduce( (op,inp) => (op[inp] = inp * 10, op),{} )

console.info(obj)

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

let data = [ 1, 2, 4 ]
let obj = {}

data.forEach(val=>{
  obj[val] = val * 10
})

console.info(obj)

Используйте reduce()

let res = [ 1, 2, 4 ].reduce((ac,a) => (ac[a] = a * 10,ac),{})
console.info(res)

Или вы также можете использовать Object.fromEntries

let res = Object.fromEntries([ 1, 2, 4 ].map(x => [x, x * 10]))
console.info(res)

Спасибо за ваш ответ. Он отлично работает и кажется наиболее эффективным решением. Code Maniac быстрее дал тот же ответ, поэтому я отметил его как правильный.

BL4CKY 29.05.2019 19:56

@BL4CKY Нет проблем, он первым дал reduce() версию.

Maheer Ali 29.05.2019 20:05

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