【问题标题】:Convert array with tree structure to object in Javascript在Javascript中将具有树结构的数组转换为对象
【发布时间】:2018-03-16 16:07:07
【问题描述】:

我有一个格式如下的数组

 let array = [{id: 1, desc: 'd1', children:[{id:1.1, desc:'d1.1', children:[]}]}, 
                 {id:2, desc:'d2', children:[] }, 
                 {id:3, desc:'d3', children:[] }];

每个子元素与父元素的时间相同。我希望它把它转换成一个格式为{ [id]: {values} }的对象:

{
 1: { id: 1, desc: 'd1', children: {1.1: {id:1.1, desc:'d1.1'}},
 2: { id:2, desc:'d2' },
 3: { id:3, desc:'d3' }
}

我尝试了很多方法,但都没有成功。例如:

let obj = array.map(a => mapArrayToObj(a));

mapArrayToObj = (e) => { 
     let obj = {[e.id]: e };
     if(e.children.lenght > 0){
       e.children = e.children.map(c => mapArrayToObj(c)); 
     }
     else{
       return {[e.id]: e }; 
     }
}

在 Javascript 中是否可行?

【问题讨论】:

  • JSON 是一种文本数据格式。你想要的只是一个对象。不涉及 JSON。我更新了您的问题以反映这一点。
  • {e.id: e } 是语法错误吗?你是想写{ [e.id]: e }吗?

标签: javascript arrays json mapping key-value


【解决方案1】:

您可以使用递归函数从给定的项目中生成一个对象,而不会改变原始数据。

function getObjects(array) {
    var object = {};
    array.forEach(function (item) {
        object[item.id] = Object.assign({}, item, { children: getObjects(item.children) });
    });
    return object;
}

var array = [{ id: 1, desc: 'd1', children: [{ id: 1.1, desc: 'd1.1', children: [] }] },        { id: 2, desc: 'd2', children: [] },        { id: 3, desc: 'd3', children: [] }];

console.log(getObjects(array));
.as-console-wrapper { max-height: 100% !important; top: 0; }

【讨论】:

  • 谢谢!什么版本也可以在 Typescript 中使用(它不喜欢分配 tot object[item.id])?
  • 对不起,我不知道 typescript
【解决方案2】:

让我们试试这段代码...

let array = [{id: 1, desc: 'd1', children:[{id:1.1, desc:'d1.1', children:[]}]},
    {id:2, desc:'d2', children:[] },
    {id:3, desc:'d3', children:[] }]

let object = {}

array.forEach(item => {
    let children = item.children
    object[item.id] = item
    object[item.id].children = {}
    children.forEach(child => {
        object[item.id].children[child.id] = child
    })
})

console.log(object)

结果:

{ '1': { id: 1, desc: 'd1', children: { '1.1': [Object] } },
  '2': { id: 2, desc: 'd2', children: {} },
  '3': { id: 3, desc: 'd3', children: {} } }

【讨论】:

  • 谢谢!什么版本也可以在 Typescript 中使用(它不喜欢分配给 object[item.id])?
【解决方案3】:

您可以使用reduce() 方法创建递归函数并返回对象对象作为结果。

let array = [{id: 1, desc: 'd1', children:[{id:1.1, desc:'d1.1', children:[]}]}, {id:2, desc:'d2', children:[] }, {id:3, desc:'d3', children:[] }]
                 
function build(data) {
  return data.reduce(function(r, {id, desc, children}) {
    const e = {id, desc}
    if(children && children.length) e.children = build(children);
    r[id] = e
    return r;
  }, {})
}

const result = build(array)
console.log(result)

【讨论】:

    猜你喜欢
    • 2023-03-18
    • 1970-01-01
    • 2020-09-13
    • 1970-01-01
    • 1970-01-01
    • 2022-01-09
    • 2021-01-09
    • 2018-03-10
    • 2014-08-14
    相关资源
    最近更新 更多