js 数组对象根据条件转换成多维数组

新手上路,请多包涵

原数组
const NAVS = [
{

label: 'a',
path: 'a', 
children: [], 
code: 'HOME', 
levelCode: '00'

},
{

label: 'b',
path: '',
code: 'QYBZK',
levelCode: '01',
children: [
  {
    label: 'b1',
    code: 'QYBZKM',
    parentCode: 'QYBZK',
    levelCode: '0101',
    children: [
      {
        label: 'b11',
        code: 'ZYCBKM',
        parentCode: 'QYBZKM',
        levelCode: '010101',
        children: []
      }
    ]
  }
]

},
{

label: 'c',
path: '',
code: 'XMGL',
levelCode: '02',
children: [
  {
    label: 'c1',
    code: 'XMGK',
    parentCode: 'XMGL',
    levelCode: '0201',
    children: []
  },
  {
    label: 'c2',
    code: 'XMPZ',
    parentCode: 'XMGL',
    levelCode: '0202',
    children: []
  }
]

},
{

label: 'd',
code: 'CBDSJ',
levelCode: '03',
children: [
  {
    label: 'd1',
    code: 'CBZB',
    parentCode: 'CBDSJ',
    levelCode: '0301',
    children: [
      {
        label: 'd11',
        code: 'CBZBCX',
        parentCode: 'CBZB',
        levelCode: '030101',
        children: []
      },
      {
        label: 'd12',
        code: 'CBZBMXCX',
        parentCode: 'CBZB',
        levelCode: '030102',
        children: []
      }
    ]
  },
  {
    label: 'd2',
    code: 'ZBRK',
    parentCode: 'CBDSJ',
    levelCode: '0302',
    children: []
  }
]

}
];
筛选条件:
const obj = {

ZBRK: true,
CBZBMXCX: true,
XMPZ: true,
ZYCBKM: true,
HOME: true

}
想得到的数组:
const NAVS = [
{

label: 'a',
path: 'a', 
children: [], 
code: 'HOME', 
levelCode: '00'

},
{

label: 'b',
path: '',
code: 'QYBZK',
levelCode: '01',
children: [
  {
    label: 'b1',
    code: 'QYBZKM',
    parentCode: 'QYBZK',
    levelCode: '0101',
    children: [
      {
        label: 'b11',
        code: 'ZYCBKM',
        parentCode: 'QYBZKM',
        levelCode: '010101',
        children: []
      }
    ]
  }
]

},
{

label: 'c',
path: '',
code: 'XMGL',
levelCode: '02',
children: [
  {
    label: 'c2',
    code: 'XMPZ',
    parentCode: 'XMGL',
    levelCode: '0202',
    children: []
  }
]

},
{

label: 'd',
code: 'CBDSJ',
levelCode: '03',
children: [
  {
    label: 'd1',
    code: 'CBZB',
    parentCode: 'CBDSJ',
    levelCode: '0301',
    children: [
      {
        label: 'd12',
        code: 'CBZBMXCX',
        parentCode: 'CBZB',
        levelCode: '030102',
        children: []
      }
    ]
  },
  {
    label: 'd2',
    code: 'ZBRK',
    parentCode: 'CBDSJ',
    levelCode: '0302',
    children: []
  }
]

}
];

根据筛选条件的code值 去找数组中对应的曾经关系,过滤掉没有的。

阅读 2.6k
1 个回答

...前面刚回答过一个惊人相似的问题。写了个通用函数,直接用吧:

function treeFilter(func, tree = []) {
  return tree.filter(data => {
    data.children = treeFilter(func, data.children)
    return func(data) || data.children.length
  })
}

调用:

let result = treeFilter(data => obj[data.code], NAVS)
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题