在所有的陣列方法裡還有 every() 跟 some() ,聽說是很冷門的兩種方法,確實我在練習上也是蠻少用到的,不過既然是歸類在陣列方法,其實也可以稍微了解一下他們的特性,我想這篇研究文大概是不會太長篇了。
every() 可以檢查所有陣列的內容是否符合指定的條件,並只會回傳一個值 true
或是 false
,用在需要比較嚴格把關資料的地方,因為只要有一個資料不符合指定條件,便會回傳 false
。
every() 語法
arr.every(callback[, thisArg])
語法的解釋其實前面幾篇都有特別提到,這邊就不再多做贅述了。另外,這裡再提供一個例子,可以幫助更快理解:
let array = [
{
name: 'Abe',
like: '珍珠奶茶',
age: 20
},
{
name: 'Billy',
like: '青茶',
age: 30
},
{
name: 'Brittany',
like: '西瓜牛奶',
age: 25
},
{
name: 'Cecily',
like: '冰淇淋紅茶',
age: 19
}
];
let ans = array.every(function(item, index, array){
console.log(item, index, array); // 物件, 索引, 全部陣列
return item.age > 10 // 當全部 age 大於 10 才能回傳 true
});
console.log(ans); // false: 只要有部分不符合,則為 false
let ans2 = array.every(function(item, index, array){
return item.age < 30
});
console.log(ans2); // true: 全部 age 都小於 30
some() 方法同樣是回傳 true
或 false
,比較不同的地方是,some() 僅需要部分符合就會回傳 true
,全部都不符合則會回傳 false
。
以上面的陣列資料為例:
let ans2 = people.some(function(item, index, array){
return item.age < 25
});
console.log(ans2); // true: 只要有部分符合,則為 true
let ans2 = people.some(function(item, index, array){
return item.age > 31
});
console.log(ans2); // false: 全部都不符合則為 false
譬如說註冊時會有幾個欄位,我們使用某些框架架設後端,假如這幾個欄位的值存在於某個後端資料裡,這時候就可以使用 every() 方法去檢查是否含有值。
// 這個範例是假設五個欄位的資料存在於 ctx.request.body 裡
if (Object.values(ctx.request.body).every(x => x !== undefined)) {
// 欄位都不是空值
} else {
// 有些欄位是空值
}
底下這個方法可以確保五個欄位都不是空的:
const requirements = ['user', 'password', 'gender', 'name', 'email'];
if (requirements.every(x => ctx.request.body[x] !== undefined)) {
// 必要的欄位都不是空值
} else {
// 有些必要的欄位是空值
}
some() 在驗證表單的部分則是以社群軟體填選為例子,假設幾個社群軟體必須至少要留一個的時候:
const socialAccounts = ['facebook', 'twitter', 'github'];
if (socialAccounts.some(x => ctx.request.body[x] !== undefined)) {
// 至少有填寫一個社群帳號
} else {
// 完全沒有填寫社群帳號
}
參考資料:
JavaScript 陣列中兩個冷門的方法:Every、Some
JavaScript 陣列處理方法