如何将数组或对象映射到对象?

时间:2019-05-29 17:39:06

标签: javascript jquery performance

通常 map 方法会返回一个Array,但是我有很多用例,而我想创建一个Object。是否有JavaScript本机的方法可以执行此操作,或者是否具有非常简单且高效的实现?也欢迎使用jQuery解决方案。

这是本机Array映射方法的工作方式(EcmaScript 6):

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

这就是我想象的方法的工作原理(如果它是JavaScript本机):

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

在此示例中,方法 mapToObject 的行为应与 map 相同,但返回对象而不是数组。回调 resolveMultiplyWithTen 会将该项乘以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 个答案:

答案 0 :(得分:3)

使用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)

答案 1 :(得分:2)

您可以只使用reduce

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)