js 数组使用filter进行多个条件筛选

现有一个数组arr = [1,5,2,'10',6],先进行item>2的筛选,然后 return item+1,只想用filter方法实现

我现在这样实现没效果

 var arr = [1,5,2,'10',6];
 var arr1=  arr.filter(item=>{

      if(item>2){
        return item+1;
      }
  })
  console.log("arr1,arr1)

你期待答案是:1.filter实现 2.结果如下

arr1= [6,'101',7]
已解决 悬赏分:0 - 解决时间 2021-11-27 21:24
反对 0举报 0 收藏 0

回答5

最佳
  • @
     var arr1=  arr.filter(item=> item > 2).map(item => item + 1);

    单纯的filter肯定做不到,要不forEach边选边加,要不就像上面这样两个循环搞定

    支持 0 反对 0 举报
    2021-11-27 05:11
  • @

    单纯用filter无法实现吧?

    支持 0 反对 0 举报
    2021-11-27 05:26
  • @

    filter()方法创建一个新数组, 其包含通过所提供函数实现的测试的所有元素。
    返回值是直接根据条件直接返回,你在if中return任何数值都不会去改变原数组中的数据。

    var arr = [1,5,2,'10',6]; //原数组
    var arr1 = []; //新数组
    
    arr.filter(item => {
    
        if (item > 2) {
    
            arr1.push(item + 1);
        }
    });
    
    console.log(arr1);
    支持 0 反对 0 举报
    2021-11-27 06:16
  • @

    你好,首先说明 filter 的作用是用来过滤数组,而你的要求是过滤同时映射转换,这就像是问我可不可以用叉子同时叉食物和喝汤。

    答案是当然可以!

    题目:

    1. 一个数组 arr = [1,5,2,'10',6]
    2. 只用 filter 方法实现
    3. 结果 arr1= [6,'101',7]
    var arr = [1, 5, 2, '10', 6];
    var arr1 = arr.filter((item, i, list) => {
      if (i + 1 < list.length && list[i+1] > 2) {
        list[i+1] += 1
      }
      return item > 2
    })
    console.log("arr1", arr1)

    (这么写估计会被打……

    还是要 filter map 一起用,或者自行封装一个

    function filterMap(
      arr,
      predicate = x => true,
      project = x => x
    ) {
      const result = []
      for (let i = 0; i < arr.length; i++) {
        if (predicate(arr[i])) {
          result.push(project(arr[i]))
        }
      }
      return result
    }
    
    console.log(filterMap(arr, x => x > 2, x => x + 1))
    支持 0 反对 0 举报
    2021-11-27 06:39
  • @

    用filter当然是很难实现的,每个方法有他特定的作用,最符合语义的其实是楼上说的filter().map(),但这无端多了一次循环感觉影响效率不是?其实这点小小效率(对现代浏览器来说真的可以忽略不计)牺牲换来语义规范对后期维护的帮助,在我看来真的利大于弊。
    如果我看到手里需要维护的项目在filter方法里面居然修改了原值我肯定会骂人的!
    你一定要一个函数搞定可以像楼上那样写个自定义filterMap函数实现,也可以用Array.reduce

    var arr1 = arr.reduce((ary, item) => {
      if (item > 2) {
        ary.push(item + 1);
      }
      return ary;
    }, []);
    支持 0 反对 0 举报
    2021-11-27 07:25