这个数组怎么筛选?算法

let arr = [
        {
            name: 'tom',
            children: [
                {name: 'tomson1', age: 11},
                {name: 'tomson2', age: 12}
            ]
        },
        {
            name: 'tony',
            children: [
                {name: 'tonyon1', age: 13},
                {name: 'tonyon2', age: 14},
                {name: 'tonyon3', age: 15}
            ]
        },
        {
            name: 'mike',
            children: [
                {name: 'mikeson1', age: 16},
                {name: 'mikeson2', age: 17}
            ]
        }
    ]
    let list = [{name: 'tom'},{name: 'tony'}, {name: 'tonyon1'}]
就是从arr取出符合list属性的所有项(或者换个说法去掉list里没有的),list里有名是带son的必有它的父级,空children要去掉
结果是如下


```
[
    {
        name: 'tom'
    },
    {
        name: 'tony',
        children: [
            {name: 'tonyon1', age: 13}
        ]
    }
]
```
怎么写方法?
阅读 1.7k
3 个回答
let arr = [{
        name: 'tom',
        children: [{
                name: 'tomson1',
                age: 11
            },
            {
                name: 'tomson2',
                age: 12
            }
        ]
    },
    {
        name: 'tony',
        children: [{
                name: 'tonyon1',
                age: 13
            },
            {
                name: 'tonyon2',
                age: 14
            },
            {
                name: 'tonyon3',
                age: 15
            }
        ]
    },
    {
        name: 'mike',
        children: [{
                name: 'mikeson1',
                age: 16
            },
            {
                name: 'mikeson2',
                age: 17
            }
        ]
    }
]
let list = [{
    name: 'tom'
}, {
    name: 'tony'
}, {
    name: 'tonyon1'
}]
let newArr = []
for (let j in list) {
    for (let i in arr) {
        if (arr[i].name == list[j].name) {
            if (arr[i].children.length > 0) {
                newArr.push(arr[i])

            }
        }
    }
}
console.log('newArr: ', newArr);

newArr就是你要的数组啦?

先把 list转化成二维数组 [{name:xxx},{name:xxxson}] => [[xxx,xxxson]]
将arr 转换为对象 [{name:xxx,children:[{name:xxxson}]}] => {xxx:{children:[]}} //也可以省略这步
然后根据list转化的二维数组构造结果

const mlist = new Map()
for (const { name } of list) {
  const m = /^(\S+?)s?on\d+$/.exec(name)
  const key = m ? m[1] : name
  const cset = mlist.get(key) || new Set()
  if (m) { cset.add(name) }
  mlist.set(key, cset)
}

const newArr = arr
  .map(({ name, children }) => {
    const cset = mlist.get(name)
    if (!cset) { return null }
    children = cset.size <= 0 || !children 
      ? []
      : children.filter(({ name }) => cset.has(name))
    return children.length > 0
      ? { name, children }
      : { name }
  })
  .filter(Boolean)
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题