Array.prototype.filter()

filter() 方法创建一个新数组,其中包含通过提供的函数实现的测试的所有元素。

使用 filter 方法从数组中提取数据

另一个有用的数组方法是 filter()(即 Array.prototype.filter())。

filter 接收一个回调函数,将回调函数内的逻辑应用于数组的每个元素,
新数组包含根据回调函数内条件返回 true 的元素。
换言之,它根据传递给它的函数过滤数组。 和 map 一样,filter 不会改变原始数组。

回调函数接收三个参数。
第一个参数是当前正在被处理的元素。 第二个参数是这个元素的索引,第三个参数是在其上调用 filter 方法的数组。

简单的例子:

1
2
3
4
5
6
7
8
const users = [
  { name: 'John', age: 34 },
  { name: 'Amy', age: 20 },
  { name: 'camperCat', age: 10 }
];

const usersUnder30 = users.filter(user => user.age < 30);
console.log(usersUnder30); // [ { name: 'Amy', age: 20 }, { name: 'camperCat', age: 10 } ] 

复杂的例子:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
// 全局变量
const watchList = [
  {
    "Title": "Inception",
    "Year": "2010",
    "imdbRating": "8.8",
  },
  {
    "Title": "Interstellar",
    "Year": "2014",
    "imdbRating": "8.6",
  }
];

const filteredList = watchList
  .map(({ Title: title, imdbRating: rating }) => ({ title, rating }))
  .filter(({ rating }) => rating > 8);

console.log(filteredList); // [ { title: 'Inception', rating: '8.8' }, { title: 'Interstellar', rating: '8.6' } ]

在原型上实现 filter 方法

为了加深对 filter 的理解,可以自己实现一个。 可以用 for 循环或 Array.prototype.forEach()

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
// 全局变量
const s = [23, 65, 98, 5];

Array.prototype.myFilter = function(callback) {
  const newArray = [];

  // for (let i = 0; i < this.length; i++) {
  //   if (callback(this[i]) === true) {
  //     newArray.push(this[i]);
  //   }
  // }
  this.forEach(function(x) {
    if (callback(x) == true) {
      newArray.push(x);
    }
  });

  return newArray;
};

const new_s = s.myFilter(function(item) {
  return item % 2 === 1;
});

console.log(new_s); // [ 23, 65, 5 ]