js将二维数组对象转化为一维数组对象

let arr = [

  {
    a: 1,
    b: 2,
    c: 3,
    children: [
      {
        id: 1,
        a: 1-1,
        b: 1-2,
        c: 1-3,
      }
    ]
  },
  {
    a: 2-1,
    b: 2-2,
    c: 2-3,
    children: []
  }
]

要将数据格式变成

clipboard.png
同时每个对象添加一个唯一的key值
function getData (arr) {
arr.forEach((item, index) => {

brr.push( Object.assign(item, {key: index}) )
if (item.children) {
  getData(item.children)
}
delete item.children;

})
return brr
}
getData(arr)

我写了个提取的方法 children提取出来了,但是原来的children还是存在,而且key值也不是唯一的

clipboard.png

阅读 14k
4 个回答

下面一段程序供参考, 层级多深都能支持。

解释下这里用for不用forEach的原因,for在当前循环判断生效后,往arr添加后面添加子项,并会影响到下次循环,而forEach则不然。本来for的这个特性是个缺陷,ES5 forEach的出现也是为了弥补这个缺陷,但是事无绝对,用得好就是优势。

for(let item of arr) {
    if(item.children) {
        arr = arr.concat(item.children);
        delete item.children
    }
}
console.log(arr);

如果要求保持顺序, 下面代码参考下

for(let i=0; i < arr.length ; i++) {
    if(arr[i].children) {
      arr = arr.slice(0,i+1).concat(arr[i].children,arr.slice(i+1))
      delete arr[i].children
    }
}
console.log(arr);

PS:能用循环解决的问题,就不要用递归,如果层次太深,内存吃不消不说,还有可能调用栈溢出,程序崩溃。

由于题主是图片, 测试代码我也贴一下吧:

let arr = [
  {
    a:1,
    b:2,
    c:3,
    children: [
      {
        id:1,
        a: 1-1,
        b: 1-2,
        c: 1-3
      },
      {
        id: 2,
        a: 1-1,
        b: 1-2,
        c: 1-3,
        children: [
          {
            id:3,
            a: 1-1,
            b: 1-2,
            c: 1-3,
            children: [
              {
                id: 4,
                a: 1-1,
                b: 1-2,
                c: 1-3
              }
            ]
          }
        ]
      }
    ]
  },
  {
    a: 2-1,
    b: 2-2,
    children: []
  }
]

lodash了解一下

注意你的push是在判断外面,依旧会执行

你要求的每个对象的key值是什么意思,有什么规则?
如果不明确这个规则,可能后续处理出的数据不一定满足你的要求。

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题