知道一个纯数字数组,如何去过滤另一个复杂数组?

新手上路,请多包涵

var a = [101, 1011, 102, 1021]

var b = [
            {
                id: 101, name: '监控',
                children: [{ id: 1011, name: '监控11' }, { id: 1012, name: '监控12' }, { id: 1013, name: '监控13' }]
            },

            {
                id: 102, name: '其他',
                children: [{ id: 1021, name: '其他21' }, { id: 1022, name: '其他22' }, { id: 1022, name: '其他23' }, { id: 102, name: '其他24' }]
            }

        ]

请问各位大神,这俩个数组,a中的数字是实际返回的,要根据a的数字筛选b数组中的元素,新数组只要ID中包含a的,结构也不能改变,因为要拿来渲染动态菜单的,请问各位大神有什么好的主意吗?谢谢啦

阅读 2.1k
3 个回答
// => [{"id":101,"name":"监控","children":[{"id":1011,"name":"监控11"}]},{"id":102,"name":"其他","children":[{"id":1021,"name":"其他21"},{"id":102,"name":"其他24"}]}]
getByIds(data, [101, 1011, 102, 1021])
var data = [
  {
    id: 101,
    name: '监控',
    children: [
      {
        id: 1011,
        name: '监控11'
      },
      {
        id: 1012,
        name: '监控12'
      },
      {
        id: 1013,
        name: '监控13'
      }
    ]
  },
  {
    id: 102,
    name: '其他',
    children: [
      {
        id: 1021,
        name: '其他21'
      },
      {
        id: 1022,
        name: '其他22'
      },
      {
        id: 1022,
        name: '其他23'
      },
      {
        id: 102,
        name: '其他24'
      }
    ]
  }
]

function getByIds (list, ids) {
  var tmp;
  return list.filter(item => {
    if(ids.some(id => id === item.id)) {
      if(item.children) {        
        tmp = item.children.filter(c => ids.some(id => id === c.id))
        if(tmp.length) {
          item.children = tmp
        }
      } else {
        item.children = []
      }
      return true
    } else {
      return false
    }
  })
}

filter + 递归即可:

function solution (arr) {
    return arr.filter(item => {
        let { id, children } = item
        if (Array.isArray(children)) {
            item.children = solution(children)
        }
        return a.includes(id)
    })
}

solution(b)
  var a = [101, 1011, 102, 1021]

  var b = [
    {
      id: 101, name: '监控',
      children: [{ id: 1011, name: '监控11' }, { id: 1012, name: '监控12' }, { id: 1013, name: '监控13' }]
    },

    {
      id: 102, name: '其他',
      children: [{ id: 1021, name: '其他21' }, { id: 1022, name: '其他22' }, { id: 1022, name: '其他23' }, { id: 102, name: '其他24' }]
    }

  ]

  const newB = b.filter(item => a.includes(item.id))
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题