js过滤对象数组

const arr1 = [
    {
        name: 'manage',
        meta: {ums:'MANAGE_ROOT'},
        children:[
            {
                name: 'manage_list',
                meta: {ums:'MANAGE_LIST'},
            },
            {
                name: 'manage_add',
                meta: {ums:'MANAGE_ADD'},
            },
            {
                name: 'manage_edit',
                meta: {ums:'MANAGE_EDIT'},
            }
        ]
    },
    {
        name: 'good',
        meta: {ums:'GOOD_ROOT'},
        children:[
            {
                name: 'good_list',
                meta: {ums:'GOOD_LIST'},
            },
            {
                name: 'good_add',
                meta: {ums:'GOOD_ADD'},
            },
            {
                name: 'good_edit',
                meta: {ums:'GOOD_EDIT'},
            }
        ]
    }
]
var arr2 = [‘MANAGE_ROOT’,‘MANAGE_LIST’,‘GOOD_ROOT’,‘GOOD_LIST’,‘GOOD_ADD’]

通过arr2筛选arr1,只保留arr1中ums属性在arr2中存在的

阅读 3.4k
3 个回答
// 复杂度O(m*n)
function filter(list, meta) {
  return list.filter(item => {
    if(meta.includes(item.meta.ums)) {
      if(item.children) item.children = filter(item.children, meta);
      return true;
    }
    return false;
  })
}

// 复杂度O(n),空间复杂度O(m)
function filter2(list, meta) {
    return list.filter(item => {
    if(meta.has(item.meta.ums)) {
      if(item.children) item.children = filter2(item.children, meta);
      return true;
    }
    return false;
  })
}

filter(arr1, arr2)
filter2(arr1, new Set(arr2))
新手上路,请多包涵

//arrList为arr1/template为arr2

function gatherList(arrList, template) {

let group = Array.from(arrList.reduce((map, data) => {

let key = data.meta.ums

if (!template.indexOf(key) != -1) {

data.children = Array.from(data.children.reduce((inMap, inData) => {

let inKey = inData.meta.ums

if (template.indexOf(inKey) != -1) {

inMap.set(inKey, inData)

}

return inMap

}, new Map()).values())

map.set(key, data)

}

return map

}, new Map()).values())

return group

};

gatherList(arr1, arr2);

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