Обычно метод карта возвращает массив, но у меня было много случаев использования, когда вместо этого я хотел бы создать объект. Есть ли собственный способ 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 для этой проблемы или более эффективный способ?
Вы можете использовать Array.prototype.reduce для преобразования массива в объект. Вам просто нужно определить, как должны быть определены ключи и значения.
I have had a lot use-cases where I would like to create an Object instead
Я сомневаюсь в этих вариантах использования.
@James Допустим, у вас есть объект и вы хотите рекурсивно изменить ключи / значения (в новый объект). В моем понимании это был бы путь.
Используйте 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 Нет проблем, он первым дал reduce()
версию.
Учитывая массив
[1, 2, 3]
, какими именно будут ключи для значений?