首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >重新排列JSON数据以将id添加到嵌套对象

重新排列JSON数据以将id添加到嵌套对象
EN

Stack Overflow用户
提问于 2018-09-30 00:17:44
回答 3查看 142关注 0票数 2

我正在尝试重新排列传入的JSON对象,以便在React组件中使用。

我收到的JSON对象是jsonData &这是我当前代码的样子:

代码语言:javascript
复制
const jsonData = {
  "Jonas": {
    "position": "CTO",
    "employees": [{
      "Sophie": {
        "position": "VP Engineering",
        "employees": [{
            "Nick": {
              "position": "Team Lead",
              "employees": [{
                  "Pete": {
                    "position": "Backend Engineer",
                    "employees": []
                  }
                },
                {
                  "Barbara": {
                    "position": "Fronted Engineer",
                    "employees": []
                  }
                }
              ]
            }
          },
          {
            "Melissa": {
              "position": "Product Manager",
              "employees": []
            }
          }
        ]
      }
    }]
  }
}

const userList = [jsonData]

const formatData = list =>
  list.map(item => {
    let name, position, employees
    for (let key in item) {
      name = key
      position = item[key].position
      employees = item[key].employees ? item[key].employees : []
    }

    return {
      name,
      position,
      employees: employees ? formatData(employees) : employees
    }
  })

console.log(formatData(userList))

我正在尝试向每个对象添加新的id &将jsonData转换为数组。我正在获取输出,但无法添加id,如下所示-

代码语言:javascript
复制
[
  {
    "id": 0,
    "name": "Jonas",
    "position": "CTO",
    "employees": [
      {
        "id": 1,
        "name": "Sophie",
        "position": "VP Engineering",
        "employees": [
          {
            "id": 2,
            "name": "Nick",
            "position": "Team Lead",
            "employees": [
              {
                "id": 3,
                "name": "Pete",
                "position": "Backend Engineer",
                "employees": []
              },
              {
                "id": 4,
                "name": "Barbara",
                "position": "Fronted Engineer",
                "employees": []
              }
            ]
          },
          {
            "id": 5,
            "name": "Melissa",
            "position": "Product Manager",
            "employees": []
          }
        ]
      }
    ]
  }
]

如何将id添加到输出的每个对象?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2018-09-30 00:38:00

您可以在id的计数器上使用带有闭包的Object.assign

代码语言:javascript
复制
function convert(object) {
    const fn = o => (name => Object.assign(
        { id: id++, name },
        o[name],
        { employees: o[name].employees.map(fn)
    }))(Object.keys(o)[0]);

    var id = 0;
    return fn(object);
}

var data = { Jonas: { position: "CTO", employees: [{ Sophie: { position: "VP Engineering", employees: [{ Nick: { position: "Team Lead", employees: [{ Pete: { position: "Backend Engineer", employees: [] } }, { Barbara: { position: "Fronted Engineer", employees: [] } }] } }, { Melissa: { position: "Product Manager", employees: [] } }] } }] } },
    result = convert(data);

console.log(result);
代码语言:javascript
复制
.as-console-wrapper { max-height: 100% !important; top: 0; }

票数 1
EN

Stack Overflow用户

发布于 2018-09-30 00:25:56

只需在循环中添加一个变量id并递增即可。

代码语言:javascript
复制
const jsonData = {
  "Jonas": {
    "position": "CTO",
    "employees": [{
      "Sophie": {
        "position": "VP Engineering",
        "employees": [{
            "Nick": {
              "position": "Team Lead",
              "employees": [{
                  "Pete": {
                    "position": "Backend Engineer",
                    "employees": []
                  }
                },
                {
                  "Barbara": {
                    "position": "Fronted Engineer",
                    "employees": []
                  }
                }
              ]
            }
          },
          {
            "Melissa": {
              "position": "Product Manager",
              "employees": []
            }
          }
        ]
      }
    }]
  }
}

const userList = [jsonData]
var id=-1;
const formatData = list =>
  list.map(item => {
    let name, position, employees
    for (let key in item) {
      name = key
      position = item[key].position
      employees = item[key].employees ? item[key].employees : []
    }
   id=id+1;
    return {
      id,
      name,
      position,
      employees: employees ? formatData(employees) : employees
    }
     
  })

console.log(formatData(userList))

票数 1
EN

Stack Overflow用户

发布于 2018-09-30 01:10:39

我认为这个方法更好,如果添加更多的话解决更多的嵌套员工数组

代码语言:javascript
复制
const jsonData = {
  "Jonas": {
    "position": "CTO",
    "employees": [{
      "Sophie": {
        "position": "VP Engineering",
        "employees": [{
          "Nick": {
            "position": "Team Lead",
            "employees": [{
              "Pete": {
                "position": "Backend Engineer",
                "employees": []
              }
            },
            {
              "Barbara": {
                "position": "Fronted Engineer",
                "employees": []
              }
            }
            ]
          }
        },
        {
          "Melissa": {
            "position": "Product Manager",
            "employees": []
          }
        }
        ]
      }
    }]
  }
}

const userList = [jsonData]


const newFormat = list => {

  findChildAndAddId(list, 0, list.length)
  return list
}

const findChildAndAddId = (item, count, parentNumber) => {
  if (item && Array.isArray(item)) {
    item.map((value, index) => {
      findChildAndAddId(value, count + index, item.length)
    })
  } else if (item) {
    Object.keys(item).map(key => {
      let value = item[key]
      item.id = count
      item.name = key
      if (value.position) {
        item.position = value.position
      }
      if (value.employees) {
        item.employees = value.employees
      }
      delete item[key]
      if (item.employees) {
        findChildAndAddId(item.employees, count + parentNumber)
      }
    })
  }
}

console.log(newFormat(userList))

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/52570232

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档