for 語句 (拆開一層陣列)
多個表達式也是可以的
for (let count = 0, total = 30 ;
count < 10 && total > 20 ;
count++, total--){
console.log(count, total)
}
//較差的寫法
for (let i=0 ; i < aArray.length ; i++) {
//statment
}
//較好的寫法
for (let i=0, len = aArray.length ; i < len; i++) {
//statment
}
for...in 語句(單物件內部屬性使用)
let person = {fname:"John", lname:"Doe", age:25}
//x 是 key
for (let x in person) {
console.log(person[x])
}
// John
// Doe
// 25
for...of 語句(陣列內是物件)
for...of語句是新的ES6語句,可以用於可迭代物件上,取出其中的值,可迭代物件包含陣列、字串、Map物件、Set物件等等。
//用於陣列
let aArray = [1, 2, 3]
for (let value of aArray) {
console.log(value)
}
//用於字串
let aString = "abcd";
for (let value of aString) {
console.log(value);
}
// 用 Object.entries 將單一物件內的多筆資料轉陣列
const object1 = {
a: 'somestring',
b: 42
};
for (let [key, value] of Object.entries(object1)) {
console.log(`${key}: ${value}`);
}
// "a: somestring"
// "b: 42"
//搭配解構賦值
const people = [
{
name: 'Mike Smith',
family: {
mother: 'Jane Smith',
father: 'Harry Smith',
sister: 'Samantha Smith'
},
age: 35
},
{
name: 'Tom Jones',
family: {
mother: 'Norah Jones',
father: 'Richard Jones',
brother: 'Howard Jones'
},
age: 25
}
];
for (let {name: n, family: { father: f } } of people) {
console.log('Name: ' + n + ', Father: ' + f)
}
// "Name: Mike Smith, Father: Harry Smith"
// "Name: Tom Jones, Father: Richard Jones"
forEach
用於陣列,且可使用 value, index, array 參數。無回傳值。
const aArray = [1, 2, 3, 4, 5]
aArray.forEach(function(value, index, array){
// 對陣列元素作某些事
console.log(index, value)
})
// jquery 是用 $.each
$each(陣列,function(index,value){
//...針對元素處理
})
用Object.keys取物件的key值轉為陣列,然後加上使用 forEach 方法
Object.keys(obj).forEach(function(key){
console.log(obj[key])
});
map (映射)
是比較常被使用的迭代方法,由於它並不會改變輸入陣列(呼叫map的陣列)的成員值,所以並不會產生副作用,最後回傳符合條件的新陣列
。
var aArray = [1, 2, 3, 4];
var newArray = aArray.map(function (value, index, array) {
return value + 100
})
//原陣列不會被修改
console.log(aArray) // [1, 2, 3, 4]
console.log(newArray) // [101, 102, 103, 104]
reduce (歸納)
藉由一個回調(callback)函式,來作前後值兩相運算,然後不斷縮減陣列中的成員數量,最終回傳一個值。
參數包含以下:
accumulator: 前一個參數,如果是第一個陣列的話,值是以另外傳入或初始化的值
const aArray = [0, 1, 2, 3, 4]
//pValue是上次迴圈的暫存值
const total = aArray.reduce(
function(pValue, value, index, array){
console.log('pValue = ', pValue,
' value = ', value, ' index = ', index)
return pValue + value
})
console.log(aArray) // [0, 1, 2, 3, 4]
console.log(total) // 10
//下面給定初始值10,注意它放的地方是在回調函式之後的參數中
const total2 = aArray.reduce(
function(pValue, value, index, array){
console.log('pValue = ', pValue, '
value = ', value, ' index = ', index)
return pValue + value
}, 10)
console.log(total2) // 20
過濾與搜尋 filter 與 find/findIndex
filter(過濾)將陣列值進行過濾,最後回傳符合條件的新陣列
。
const aArray = [1, 3, 5, 7, 10, 22]
const bArray = aArray.filter(function (value, index, array){
return value > 6
})
console.log(aArray) //[1, 3, 5, 7, 10, 22]
console.log(bArray) //[7, 10, 22]
find與findIndex方法都是在搜尋陣列值用的,
find在尋找到符合條件時會回傳值(value)
findIndex則是回傳符合條件的索引值(index)
const aArray = [1, 3, 5, 7, 10, 22]
const bValue = aArray.find(function (value, index, array){
return value > 6
})
const cIndex = aArray.findIndex(function (value, index, array){
return value > 6
})
console.log(aArray) //[1, 3, 5, 7, 10, 22]
console.log(bValue) //7
console.log(cIndex) //3
Array.prototype.find()
find() 與 filter() 很像,但 find() 只會回傳一次值,且是第一次為 true 的值。
常用於查詢是否有此值在陣列中
var people = [
{
name: 'Casper',
like: '鍋燒意麵',
age: 18
},
{
name: 'Wang',
like: '炒麵',
age: 24
},
{
name: 'Bobo',
like: '蘿蔔泥',
age: 1
},
{
name: '滷蛋',
like: '蘿蔔泥',
age: 3
}
];
var findAgeThan5 = people.find(function(item, index, array){
return item.age > 5;
// 取得大於五歲的
});
console.log(findAgeThan5);
// 雖然答案有兩個,但只會回傳 Casper 這一個物件
Array.prototype.every()
every() 可以檢查陣列是否符合所有條件,這僅會回傳一個值 true
or false
,可以用來檢查陣列中的內容是否符合特定條件。
var array = [
{
name: 'Casper',
like: '鍋燒意麵',
age: 18
},
{
name: 'Wang',
like: '炒麵',
age: 24
},
{
name: 'Bobo',
like: '蘿蔔泥',
age: 1
},
{
name: '滷蛋',
like: '蘿蔔泥',
age: 3
}
];
var ans = array.every(function(item, index, array){
console.log(item, index, array);
// 物件, 索引, 全部陣列
return item.age > 10
// 當全部 age 大於 10 才能回傳 true
});
console.log(ans);
// false: 只要有部分不符合,則為 false
var ans2 = array.every(function(item, index, array){
return item.age < 25
});
console.log(ans2);
// true: 全部 age 都小於 25
Array.prototype.some()
some() 與 every() 非常接近,都是回傳 true or false,差異僅在 every() 需完全符合,some() 僅需要部分符合。
var ans = people.some(function(item, index, array){
return item.age > 10
});
console.log(ans);
// true: 只要有部分符合,則為 true
var ans2 = people.some(function(item, index, array){
return item.age < 25
});
console.log(ans2);
// true: 只要有部分符合,則為 true
var ans2 = people.some(function(item, index, array){
return item.age > 25
});
console.log(ans2);
// false: 全部都不符合則為 false