javascript - 更有效更短的JS代码?
问题描述
在这项任务中,我需要一些建议。
我们有这样的结构:
const scenes = {
'Node1': {
'scene1': [
{
nodeKey: 'cccc',
category: 'user',
},
{
nodeKey: 'eeee',
category: 'interface',
},
]
},
}
我需要这样做:
let result = {
'Node1': {
'scene1': {
'cccc': {
nodeKey: 'cccc',
category: 'user',
}
}
}
}
我使用reduce函数使其工作。但我认为它可以更有效地完成。谢谢!
我的代码(更新):
function makeNewStructure(scenes) {
return Object.keys(scenes).reduce((prevNode, currentNode) => ({
...prevNode,
[currentNode]: Object.keys(scenes[currentNode]).reduce((prevScene, currentScene) => ({
...prevScene,
[currentScene]: scenes[currentNode][currentScene].reduce((previous, current) => ({
...previous,
[current.nodeKey]: current
}),{})
}), {})
}), {})
}
或者我们可以这样做。但我认为无论如何使用reduce(仅)功能会更好。唔
function makeNewStructure(scenes) {
return Object.keys(scenes).reduce((prevNode, currentNode) => {
let node = {}
let currentScenesInNode = scenes[currentNode]
for (let scene in currentScenesInNode) {
let updatedScene = {}
currentScenesInNode[scene].forEach(item => {
return updatedScene[item.nodeKey] = item
})
node[scene] = updatedScene
}
return {
...prevNode,
[currentNode]: node
}
}, {})
}
解决方案
在惰性较低的版本中,JSON.parse
或JSON.stringify
可用于枚举所有值:
const scenes = { 'Node1': { 'scene1': [ { nodeKey: 'cccc', category: 'user' , },
{ nodeKey: 'eeee', category: 'interface', }, ] } }
const result = JSON.parse( JSON.stringify(scenes), (key, val) =>
Array.isArray(val) ? val.reduce((o, v) => (o[v.nodeKey] = v, o), {}) : val)
console.log( result )
否则,递归函数或 JS 库可以用于类似的方法。
推荐阅读
- google-cloud-platform - Google Cloud Stackdriver:按 ip 分组的指标
- angularjs - AngularJS JSONP成功功能不起作用
- angular - Azure Devops - 构建定义 ng 构建错误无法读取未定义的属性“_statSync”
- vba - VBA 字符串作为命令文本(不带引号的字符串)
- angular - Angular Renderer2 删除侦听器将 EventListeners 留在内存中 - 内存泄漏?
- javascript - 带有 url 模式集的匹配 URL 包含正则表达式
- ios - 当用户从 UITextfield 清除文本时禁用按钮
- html - 为什么我在 Html 下拉列表中收到 400 Bad Request
- python - Python:threading.Thread,值是按值传递还是按引用传递?
- android - 无法在基于 AMD 的 PC 的模拟器中运行反应本机应用程序?