var newArray = arr.filter(callback(element[, index[, array]])[, thisArg])
function isBigEnough(value) { return value >= 10; } var filtered = [12, 5, 8, 130, 44].filter(isBigEnough); document.write("Input: [12, 5, 8, 130, 44]"); document.write("<p>Output: number >=10 : " + filtered); // filtered is [12, 130, 44]//-->
我們也可以用它搭配可去掉空字串的字串方法trim(),再將陣列沒用或空的元素刪除,就可得到一個新的、乾淨的陣列。
let arr = ['Hello', '', 'Hi', null, undefined, 'Ciao', ' ']; let newArr = arr.filter(function (inutile) { return inutile && inutile.trim(); }); newArr; // ['Hello', 'Hi', 'Ciao']需注意,在IE9(不包含IE9)以下的版本並不支援trim()方法。
透過filter()函式的第一參數:callback 函式所指定的過濾條件,返回一個新陣列 (非常好用)。 例如我們只想保留陣列裡,字串長度大於三的字串元素,可以輕易地取得。
let arr = ['Jack', 'Joe', 'John', 'May', 'Su', 'Ada']; let arr2 = arr.filter(function(value) { return value.length > 3; }); arr2.join('、'); // Jack、John
更簡潔的方式使用箭頭函式(Arrow function ):
let arr = ['Jack', 'Joe', 'John', 'May', 'Su', 'Ada']; let arr2 = arr.filter(value => value.length > 3);
利用filter(),我們也可以輕鬆地去除陣列裡重複的元素,可以達到這樣的效果是因為使用indexOf()會回傳第一個元素位置的(index), 如果之後有重複元素的位置與indexOf()回傳的位置不相等,就會被filter()過濾掉。而這時的過濾結果,只會先保留第一個找到的元素, 第二個重複的元素就不會被放進回傳的陣列裡了。
let arr = ['B', 'A', 'E', 'C', 'A', 'F', 'G', 'E']; let newArr = arr.filter(function (element, index, self) { return self.indexOf(element) === index; });
我們更可以把這些去掉重複的元素,且讓陣列的排序整齊一點的功能,包成一個函式,使用起來就方便多了。
let arr = ['B', 'A', 'E', 'C', 'A', 'F', 'G', 'E']; function removeDuplicates(originArray) { let result = originArray.filter(function(value, index, arrSelf){ return arrSelf.indexOf(value) === index }); return result.sort(); }; removeDuplicates(array);
var people=[ { name: 'Casper', like: '鍋燒意麵', age: 18 }, { name: 'Wang', like: '炒麵', age: 24 } , { name: 'Bobo', like: '蘿蔔泥', age: 1 }, { name: '滷蛋', like: '蘿蔔泥', age: 3 } ] var findEmpty = people.find(function(item, index, array){ }); document.write(findEmpty); // 沒有條件,會是 undefined var findAgeThan5 = people.find(function(item, index, array){ return item.age > 5; // 取得大於五歲的 }); document.write("<p>Age>5: " + findAgeThan5.name); // 雖然答案有兩個,但只會回傳 Casper 這一個物件 var findLike = people.find(function(item, index, array){ return item.like === '蘿蔔泥'; // 取得陣列 like === '蘿蔔泥' }); document.write("<p>Like 蘿蔔泥: " + findLike.name); //-->
var even_nums = [2,4,6,8]; document.write("Input: " + even_nums); even_nums.forEach(function (value, index, array) { array[index] += 2; });
列印內含物件的陣列,用 forEach() 也很方便,如下例:
var people=[ { name: 'Casper', like: '鍋燒意麵', age: 18 }, { name: 'Wang', like: '炒麵', age: 24 } , { name: 'Bobo', like: '蘿蔔泥', age: 1 }, { name: '滷蛋', like: '蘿蔔泥', age: 3 } ] document.write("<p>people: "); people.forEach(function (value, index, array) { document.write("<br>{" + "name:" + array[index].name + ", like: " + array[index].like + ", age: " + array[index].age +"}") });
上例的列印,只適用於該陣列。列印一般陣列,請參照下例:
function prtobj(obj){ document.write("<br>{"); Object.keys(obj).forEach(e=>document.write(e+":"+obj[e]+", ")) document.write("}"); }; document.write("<p>people:"); people.forEach(value =>prtobj(value));
var newArr = arr.map(function (value, index, array){ //... });
例:陣列中每項都加2:
var even_nums = [2,4,6,8]; var even_nums2=even_nums.map(function (value, index, array) { return value+2; });
或用箭頭函式:
var even_nums = [2,4,6,8]; var even_nums2=even_nums.map(value=>value+2);
var numbers = [1, 4, 9]; var roots = numbers.map(Math.sqrt); //map會return一個新的array
var kvArray = [{key: 1, value: 10}, {key: 2, value: 20}, {key: 3, value: 30}]; var reformattedArray = kvArray.map(function(obj) { var rObj = {}; rObj[obj.key] = obj.value; return rObj; });
var nums = [1,3,5,7,9]; var ans1=nums.every(function (value, index, array) { return value>=3; }); var ans2=nums.every(function (value, index, array) { return value%2 == 1; });
var nums = [1,3,5,7,9]; var ans1=nums.some(function (value, index, array) { return value>=3; }); var ans2=nums.some(function (value, index, array) { return value%2 == 0; });
Array.reduce(callback[accumulator, currentValue, currentIndex, array], initialValue)
例題
<script language="JavaScript"> var nums=[1,2,3,4,5]; var reducePlus = nums.reduce(function(accumulator, value, index, array){ return accumulator + value; }, 0); // 傳入初始化值為 0 document.write("<p>總和為: " + reducePlus); // 總和為 15 var reducePlus = nums.reduce(function(accumulator, value, index, array){ return Math.max( accumulator, value ); // 與前一個值比較哪個大 }, 0); document.write("<p>最大值為: " + reducePlus); // 最大值為 5 </script>上述範例若未提供預設值,accumulator(累計值)就會取陣列的第一個元素也就是 1,而 value 就會從陣列的第二個值開始 loop。
例題
var people=[ { name: 'Casper', like: '鍋燒意麵', age: 18 }, { name: 'Wang', like: '炒麵', age: 24 } , { name: 'Bobo', like: '蘿蔔泥', age: 1 }, { name: '滷蛋', like: '蘿蔔泥', age: 3 } ] var reduceEmpty = people.reduce(function(accumulator, value, index, array){ }); document.write(reduceEmpty); // 沒有條件,會是 undefined var reducePlus = people.reduce(function(accumulator, value, index, array){ return accumulator + value.age; }, 0); // 傳入初始化值為 0 document.write("<p>總和為: " + reducePlus); // 總和為 46 var reducePlus = people.reduce(function(accumulator, value, index, array){ return Math.max( accumulator, value.age ); // 與前一個值比較哪個大 }, 0); document.write("<p>最大值為: " + reducePlus); // 最大值為 24
合併陣列
var arr = [['a', 'b'], ['c', 'd'], ['e', 'f']]; var arr.reduce(function(accumulator, value, index, array){ return accumulator.concat(value); }, []); document.write("<p>合併後的陣列為: " + reduceArr); // ['a', 'b', 'c', 'd', 'e', 'f'];