数组的筛选排序

272 阅读1分钟
// 源数据
// 条件:id需为数字,并根据id进行排序,输入name
const source = [
   null,
   { id: 4, name: 'test1' },
   { id: {}, name: 'ssdf' },
   "test",
   { id: () => { }, name: 'sf' },
   { id: '6', name: 'test3' },
   { id: 6, name: 'test4' },
   { id: 7, name: 'test7' },
   { id: 2, name: 'test2' },
   { name: 'sf' },
   {},
   () => { }
]

// 要求输入 ['test2','test1','test4','test7']

方法1(使用filter、sort、map):

    function filterSort(data) {
      let arr = data.filter(item => {
        return typeof(item?.id) === 'number'
        // 返回每一项存在id且id为Number类型
       })
       
       arr.sort((a, b) => a.id - b.id)
       // 根据id对数据进行排序
       
       return arr.map(item => item.name)
       // 返回name组成的新数组
    }
    
    let res = filterSort(source)
    console.log(res)
    //输出结果:['test2','test1','test4','test7']

方法2(使用reduce、map):

    function filterSort(data) {
      let res = source.reduce((arr, item) => {
        if (typeof(item?.id) != 'number') return arr
        
        arr[item.id] = item.name
        // 将符合条件项的id作为下标进行赋值
        
        return arr
      },[])
      // 此时的输出结果为:[empty × 2, "test2", empty, "test1", empty, "test4", "test7"]
      
      return res.filter(item => item)
      // 通过filter将空值过滤掉
    }
    
    let res = filterSort(source)
    console.log(res)
    //输出结果如下['test2','test1','test4','test7']