JavaScript 数组迭代方法
Array.forEach()
forEach()
方法为每个数组元素调用一次函数(回调函数)。该函数接受 3 个参数项目值、项目索引、数组本身。
个人理解:将数组中每个元素都作为一个参数去调用方法,执行一个回调函数,结果不返回,原数组没有改变。直接输出结果为undefined。
var numbers = [4, 9, 16, 25, 29];
var first = numbers.find(myFunction); //25
function myFunction(value, index, array) {
return value > 18;
}
Array.map()
map()
方法通过对每个数组元素执行函数来创建新数组。
map()
方法不会对没有值的数组元素执行函数。
map()
方法不会更改原始数组。
个人理解:能够调用方法并返回一个新数组,原数组没有改变。直接输出结果为调用函数后的数组。
var numbers1 = [45, 4, 9, 16, 25];
var numbers2 = numbers1.map(myFunction); //90,8,18,32,50
function myFunction(value, index, array) {
return value * 2;
}
forEach()与map()的区别
两者都能return数据,但是
forEach()
没有返回值,如果不return数据的话,forEach()
返回的是undefined,而map()
返回了数组元素中间的(,)号
var numbers1 = [45, 4, 9, 16, 25];
var numbers2 = numbers1.map(myFunction); //,,,,
var numbers3 = numbers1.forEach(myFunction) //undefined
function myFunction(value, index, array) {
value * 2;
}
Array.filter()
filter()
方法创建一个包含通过测试的数组元素的新数组。
个人理解:用于过滤数组元素。返回结果为过滤后的数组。
var numbers = [45, 4, 9, 16, 25];
var over18 = numbers.filter(myFunction); //45,25
function myFunction(value, index, array) {
return value > 18;
}
filter()与map()、forEach()的区别
在上面的这个方法中,如果将
filter()
换成map()
,返回的值是布尔型,符合条件为true,不符合为flase,换成forEach()
返回undefined。
Array.reduce()
reduce()
方法在每个数组元素上运行函数,以生成(减少它)单个值。
reduce()
方法在数组中从左到右工作。另请参见 reduceRight()
。
reduce()
方法不会减少原始数组。
个人理解:从左到右执行,最终得到一个执行后的值,第一个参数为执行到当前index之前的结果,第二个参数为当前index。
var numbers1 = [45, 4, 9, 16, 25];
var sum = numbers1.reduce(myFunction); //99
function myFunction(total, value, index, array) {
return total + value;
}
reduce()
可以接收一个初始值,就是说在初始值上计算数组元素的总和,初始值+元素总和。
var numbers1 = [45, 4, 9, 16, 25];
var sum = numbers1.reduce(myFunction, 100); //199
function myFunction(total, value) {
return total + value;
}
Array.reduceRight()
reduceRight()
方法在每个数组元素上运行函数,以生成(减少它)单个值。
reduceRight()
方法在数组中从右到左工作。另请参见 reduce()
。
reduceRight()
方法不会减少原始数组。
个人理解:与
reduce()
方法不同的是这个方法是从右到左执行。
var numbers1 = [45, 4, 9, 16, 25];
var sum = numbers1.reduceRight(myFunction,100); //199
function myFunction(total, value, index, array) {
return total + value;
}
Array.every()
every()
方法检查所有数组值是否通过测试。
个人理解:结果返回一个布尔值,如果所有数组元素都符合条件则返回true,否则返回flase。
var numbers = [45, 4, 9, 16, 25];
var allOver18 = numbers.every(myFunction); //flase
function myFunction(value, index, array) {
return value > 18;
}
every()与filter()、map()的区别
在上面的示例中,
every()
返回一个为flase的布尔值,因为数组元素并不是全部大于18,filter()
返回所有大于18的元素,[45,25],map()
返回一串布尔值,[true,flase,flase,flase,true],符合条件的为true,不符合为flase。
Array.some()
some()
方法检查某些数组值是否通过了测试。
个人理解:结果返回一个布尔值,如果有一个或以上数组元素都符合条件则返回true,否则返回flase。
var numbers = [45, 4, 9, 16, 25];
var someOver18 = numbers.some(myFunction); //true
function myFunction(value, index, array) {
return value > 18;
}
some()与every()的区别
some()
与every()
的返回值都是一个布尔值,区别在于some()
只要数组中有符合条件的元素就返回true,而every()
需要数组元素全部符合条件才返回true。
Array.indexOf()
indexOf()
方法在数组中搜索元素值并返回其位置。
个人理解:从左往右搜索值为"Apple"的数组元素,返回找到的元素下标。第一个参数为搜索的值,第二个参数可选,为开始搜索的位置,负数则从数组末尾开始计算,但还是从左往右。
var fruits = ["Apple", "Orange", "Apple", "Mango"];
var a = fruits.indexOf("Apple",1); //2
Array.lastIndexOf()
Array.lastIndexOf()
与 Array.indexOf()
类似,但是从数组结尾开始搜索。
个人理解:与
indexOf()
的区别在于从右往左搜索值为“Apple”的数组元素。第二个参数没有变化,正数从左往右数下标,负数从右往左数下标
var fruits = ["Apple", "Orange", "Apple", "Mango"];
var a = fruits.lastIndexOf("Apple",1); //2
Array.find()
find()
方法返回通过测试函数的第一个数组元素的值。
var numbers = [4, 9, 16, 25, 29];
var first = numbers.find(myFunction); //25
function myFunction(value, index, array) {
return value > 18;
}
Array.findIndex()
findIndex()
方法返回通过测试函数的第一个数组元素的索引。
var numbers = [4, 9, 16, 25, 29];
var first = numbers.findIndex(myFunction); //3
function myFunction(value, index, array) {
return value > 18;
}