将JavaScript数组映射到对象
我经常写代码的一个常见任务是将数组映射到对象。这可能是将一个原始类型的数组通过映射函数映射到一个对象,也可能更复杂,例如将一个对象数组映射到一个单一的对象。幸运的是,这两种情况的实现原理基本相似。
将原始类型的数组映射到对象
可以通过将每个元素映射到一个键和值,将原始类型的数组转换为对象。键是元素本身,值是将映射函数应用于元素的结果。
为了实现这个目标,我们可以使用Array.prototype.map()
和一个映射函数,该函数接收元素、索引和数组,并返回映射后的值。然后,将映射函数的结果传递给Object.fromEntries()
,该方法从键值对数组创建一个对象。
const mapObject = (arr, fn) =>
Object.fromEntries(arr.map((el, i, arr) => [el, fn(el, i, arr)]));
mapObject([1, 2, 3], a => a * a);
// { 1: 1, 2: 4, 3: 9 }
将对象数组映射到对象
接下来,我们可以扩展这个代码片段,将对象数组映射到一个对象。这可以通过使用一对映射函数将每个对象映射到一个键和值来实现。第一个映射函数用于映射键,第二个映射函数用于映射值。
const mapObject = (arr, mapKey, mapValue = i => i) =>
Object.fromEntries(
arr.map((el, i, arr) => [mapKey(el, i, arr), mapValue(el, i, arr)])
);
```javascript
const people = [ { name: 'John', age: 42 }, { name: 'Adam', age: 39 } ];
mapObject(people, p => p.name.toLowerCase());
// { john: { name: 'John', age: 42 }, adam: { name: 'Adam', age: 39 } }
mapObject(
people,
p => p.name.toLowerCase(),
p => p.age
);
// { john: 42, adam: 39 }
[!NOTE]
在这种情况下,映射函数参数的顺序只是个人偏好。如果您计划在函数管道中使用该代码片段,可以随意调整它们的顺序。