在
filter
的世界裡就是把一個集合透過你想要做的事情之後變成另一個集合,完全不用去 loop collection。
前兩天我們介紹了 map
和 reduce
,相信大家應該會覺的這兩者的操作方式其實不會差太多,都是針對一個集合做操作,然後告訴他想要做的事情。
今天要介紹的 filter
其實也是一樣的,就是把想要的給挑出來。我們從例子來下手吧。
假設我們有以下的資料:
interface Student {
name : string;
height :number;
}
let students = [
{
name:"Love",
height : 164
},
{
name: "Andrew",
height : 178
},
{
name: "Marie",
height : 165
},
{
name: "Faith",
height : 180
},
{
name: "Kayla",
height : 160
},
]
我想要從 students
裡面挑出所有身高大於 165 公分的學生出來,如果我們不使用 filter
的話,我們就會必須這樣做:
let greater165Students:Student[] = [];
for(let i=0; i< students.length; i++) {
if (students[i].height > 165) {
greater165Students.push(students[i]);
}
}
for(let i=0; i<greater165Students.length; i++){
console.log(greater165Students[i]);
}
// 上述的結果會是
// { name: 'Andrew', height: 178 }
// { name: 'Faith', height: 180 }
如果我們使用 filter
我們就可以這樣做:
let greaterThan165Students = students.filter(s => s.height > 165);
for (let i = 0; i < greaterThan165Students.length; i++) {
console.log(greaterThan165Students[i]);
}
// 上述的結果會是
// { name: 'Andrew', height: 178 }
// { name: 'Faith', height: 180 }
上面的重點就在於 s => s.height > 165
,這行程式碼的意思就是對於 students
裡的每一個元素 s
當其判斷 s.height > 165
為真實,就要保留下來。
今天的範例中,如果我們不要使用 for
迴圈列印所有符合 height > 165
的學生,但是要有相同的結果我們可以怎麼做呢?
function squareList(data: number[]) {
return data.map(x => x*x);
}