javascript - 使用高阶函数将嵌套数组转换为对象数组
问题描述
我目前有这个输入:
[
[['firstName', 'Joe'], ['lastName', 'Blow'], ['age', 42], ['role', 'clerk']],
[['firstName', 'Mary'], ['lastName', 'Jenkins'], ['age', 36], ['role', 'manager']]
];
输出应如下所示:
[
{ firstName: 'Joe', lastName: 'Blow', age: 42, role: 'clerk' },
{ firstName: 'Mary', lastName: 'Jenkins', age: 36, role: 'manager' }
];
我写了以下代码:
function transformEmployeeData(array) {
let newArr = [];
for(var i = 0; i< array.length; i++) {
let newObj = {}
for(var j = 0; j< array[i].length; j++) {
newObj[array[i][j][0]] = array[i][j][1]
}
newArr.push(newObj);
}
return newArr;
}
但是,我想尝试使用.map()
and.reduce()
函数。我该如何实施它们?
解决方案
最简单的方法是可能使用.map()
然后Object.fromEntries()
用作您的映射函数,如下所示:
const arr = [
[['firstName', 'Joe'], ['lastName', 'Blow'], ['age', 42], ['role', 'clerk']],
[['firstName', 'Mary'], ['lastName', 'Jenkins'], ['age', 36], ['role', 'manager']]
];
const res = arr.map(Object.fromEntries);
console.log(res);
但是,如果您真的想使用.reduce()
,那么您可以使用.map()
and.reduce()
为您构建对象:
const arr = [
[['firstName', 'Joe'], ['lastName', 'Blow'], ['age', 42], ['role', 'clerk']],
[['firstName', 'Mary'], ['lastName', 'Jenkins'], ['age', 36], ['role', 'manager']]
];
const res = arr.map(
entries => entries.reduce((acc, [key, value]) => ({...acc, [key]: value}), {})
);
console.log(res);
以上用于.reduce()
迭代[key, value]
内部数组中的对数组。对于每个键值对,您可以对其进行解构( ([key, value]) =>
) 以从数组中提取 thekey
和 the 。value
然后,您可以返回一个对象以用作acc
umulator 的下一个值。您返回的对象是acc
(最初是{}
)和当前键值对的组合对象。这是使用带有计算属性名称( ) 的扩展语法( ) 完成的。...
{[key]: value}
最后一种方法是将每个内部映射[key, value]
到一个对象:
[
[ { "firstName": "Joe" }, { "lastName": "Blow" }, { "age": 42 }, { "role": "clerk" } ],
[ { "firstName": "Mary" }, { "lastName": "Jenkins" }, { "age": 36 }, { "role": "manager" } ]
]
然后,您可以使用 将此数组映射到对象数组Object.assign()
,其中每个参数Object.assign()
都是内部数组中的对象。这将“合并”数组中的每个对象以形成一个更大的对象:
const arr = [
[['firstName', 'Joe'], ['lastName', 'Blow'], ['age', 42], ['role', 'clerk']],
[['firstName', 'Mary'], ['lastName', 'Jenkins'], ['age', 36], ['role', 'manager']]
];
const res = arr.map(
entries => entries.map(([k, v]) => ({[k]: v}))
).map(arr => Object.assign(...arr));
console.log(res);
推荐阅读
- javascript - 自定义容器内的材质 UI 工具提示
- excel - VBA 在消息框中弹出警告标志但没有错误消息
- bash - 并行读取行作为变量(Bash)
- flutter - Flutter:全局保存列表的方法是什么,以便在浏览我的应用程序后保持状态?
- c - 使用 fget 后 char* 值发生变化
- android - 带有两个 FirestoreRecyclerAdapter 的嵌套 RecyclerView
- mysql - 向名为“Grant”的用户授予权限?
- java - 如何解决 org.eclipse.core.runtime 引用不正确版本的 org.eclipse.equinox.common 的问题?
- javascript - .join() 在一个示例中有效,但在另一个示例中无效
- migration - 如何将现有的 20.04 ext4 安装迁移到不同磁盘上的 zfs root?