首页 > 解决方案 > 更有效更短的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
    }
  }, {})
}

标签: javascript

解决方案


在惰性较低的版本中,JSON.parseJSON.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 库可以用于类似的方法。


推荐阅读