javascript - 如何将数组或对象映射到对象?
问题描述
通常map方法返回一个数组,但我有很多用例,我想创建一个对象。是否有 JavaScript 原生方式来执行此操作或非常简单且高性能的实现?也欢迎使用 jQuery 解决方案。
这就是原生 Array map 方法的工作原理(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相同,但返回 Object 而不是 Array。回调resolveMultiplyWithTen会将项目乘以十。
我在这里看到的一个问题是回调函数不能返回两个值(键和值,例如: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 解决方案或更高效的方法?
解决方案
利用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)
推荐阅读
- javascript - 点击事件在 :active 选择器之后触发
- .htaccess - 重写 .htaccess 以从 URL 中删除子目录
- mysql - MySQL 工作台迁移向导中的笑脸翻译错误
- automl - 部署 AUTOML NL 训练模型失败
- c# - DataServiceContext 将 odata.type 添加到 json 正文
- javascript - 如何获取收件箱中的所有消息?(包括回复)
- c# - 使用动态数字属性建模的 JSON
- generics - 为什么 Rust 不使用默认的泛型参数类型
- javascript - JavaScript Prototype 属性未添加到其继承的对象
- python-3.x - 如何修复“无效语法”以下载 spacy 模型