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]
阅读 17.2k
5 个回答
 var arr1=  arr.filter(item=> item > 2).map(item => item + 1);

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

单纯用filter无法实现吧?

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);

你好,首先说明 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))

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

var arr1 = arr.reduce((ary, item) => {
  if (item > 2) {
    ary.push(item + 1);
  }
  return ary;
}, []);
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题
宣传栏