Как я могу сопоставить массив или объект с объектом? - PullRequest
0 голосов
/ 29 мая 2019

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

Вот как работает собственный метод карты Array (EcmaScript 6):

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

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

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

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

Проблема, которую я вижу здесь, состоит в том, что функция обратного вызова не может возвращать два значения (ключ и значение, например: 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.log(obj);
// => { 1: 10, 2: 20, 4: 40 }

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

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

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

Ответы [ 2 ]

3 голосов
/ 29 мая 2019

Использование reduce()

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

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

let res = Object.fromEntries([ 1, 2, 4 ].map(x => [x, x * 10]))
console.log(res)
2 голосов
/ 29 мая 2019

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

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

console.log(obj)

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

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

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

console.log(obj)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...