首页 > 代码库 > 浅析ES5 中对数组遍历的5个扩展方法
浅析ES5 中对数组遍历的5个扩展方法
1. ForEach
功能: 遍历数组中的每一个元素, 并且将每一个元素的处理过程交给回调函数
语法: 数组.forEach( callback )
回调函数中会传入两个参数, 一个是遍历的数组元素, 一个是当前的索引.
例如: 遍历打印数组中的每一个元素与索引号
传统:
for ( var i = 0; i < arr.length; i++ ) {
console.log( i + ‘, ‘ + arr[ i ] ); // 打印, 索引号 与 当前元素
}
forEach:
arr.forEach( function ( value, index ) {
console.log( index + ‘, ‘ + value );
} );
JQ中each方法与forEach方法的异同
-> 参数
jq: ( arr, 回调函数 ), 回调函数的参数是 i, v
数组: ( 回调函数 ), 回调函数的参数是 v, i
-> 返回值
jq: 有返回值, 即当前遍历的数组或对象.
数组: 没有返回值
补充: jq 方法可以遍历数组, 伪数组, 对象; 而数组中的方法只能遍历数组.
-> 执行的功能
jq 中 this 指的是当前遍历的对象, 而数组中的 this 默认是 window.
在 jq 中遍历的数据如果是一个基本类型的数据( number, boolean, string ),
this 指其包装对象. 如果需要拿到遍历的基本类型数组的值, 要么使用 valueOf, 要么使用参数 v
数组的 forEach 方法不能停止, 只能全部遍历完毕才会结束.
jq 中直接给回调函数返回 false 即可跳出循环.
2. map
功能: 将一个集合按照特定的规律变成另一个集合..
语法: 数组.map( 回调函数 )
简单的来理解, map也是在遍历数组. 这种理解不准确…
分析: 如果回调函数没有返回值, 注意默认返回了 undefined
例如: 有数字构成的集合, 将其中 的数字扩大一倍.
map 的实现逻辑
1> map 函数要返回一个数组
2> map 返回的这个数组的元素由 回调函数的返回值决定
map 函数也是如此, map 函数中的回调函数来实现我们的规则
var newArr = arr.map( function ( v, i ) {
return v * 2;
});
我们的要求是将数组中的元素转换成另一个东西, 那么这个转换的过程由回调函数来实现
典型的案例:
‘a,b,c‘.split( ‘,‘ ).map(function ( v ) {
return ‘<td>‘ + v + ‘</td>‘;
});
// [ ‘a‘, ‘b‘, ‘c‘ ] => [ ‘<td>a</td>‘, ‘<td>b</td>‘, ‘<td>c</td>‘ ]
将箭头函数引入 map. 上面的案例就可以改良成
‘a,b,c‘.split( ‘,‘ ).map( v => ‘<td>‘ + v + ‘</td>‘ );
jq 中map 方法与map的异同
-> 参数
与其回调函数的参数一样
-> 返回值
数组的返回值是一个数组, jq 的返回值也是数组
数组的返回值必须保证每一个回调函数都有返回数据. 如果没有相当于 返回 undefined
jq 中 map 方法的返回值中的元素由 回调函数的返回值决定, 如果没有回调函数返回,则为空数组
其实在 jq 中 map 相当于结合了数组中提供的 map 与 filter 的功能
-> 执行的功能
如果 jq 作为 $.map 来调用, 回调函数中不能使用 this, 其 this 是 window, 参数是 v,i
如果 jq 作为 $( ... ).map() 来调用, 回调函数中的 this 就是当前遍历的元素. 其参数是 i, v
补充:
$.map( arr, function ( v, i ) { ... } )
$( ‘...‘ ).map( function () { ... } )
3.4. every 和 some
some 方法, 表示判断数组中的元素只要含有某一个条件即可
every 方法, 表示判断数组中的每一个元素必须含有某个条件
语法: 数组.方法名( 回调函数 ) -> boolean
说明:
1> 回调函数依旧是遍历数组的每一个元素
2> 回调函数的参数依旧是 v, i
3> 回调函数的作用是用来判断数组中的元素, 所以回调函数有返回值, 返回一个 boolean
4> some 方法凡是发现满足了条件的元素就会停止遍历, 并返回 true, 否则返回 false.
5> every 方法凡是发现了一个元素不满足条件就会停止遍历, 并返回 false, 否则返回 true.
该方法与逻辑中断类似 是逻辑中断的升级版.
|| 表达式1 || 表达式2
如果表达式1为假, 才会判断表达式2, 如果表达式1已经真 那么不执行表达式2, 就得到结果
&& 表达式1 && 表达式2
如果表达式1为假, 那么不在判断表达式2, 直接得到结果为假, 如果表达式1为真, 再判断表达式2
5. filter
功能: 将一个数组中符合某要求的所有元素筛选出来, 组成一个新的数组返回.
语法: 数组.filter( 回调函数 ) -> 新数组
回调函数的参数依旧是 v, i
回调函数判断的时候, 判断元素 v 是否符合要求, 如果符合返回 true, 否则返回 false
filter 就会将所有的符合元素组成新的数组
案例: 将所有的数字中奇数取出来.
var arr = [ 1, 2, 3, 4, 5, 6, 7, 8, 9, 0 ];
arr.filter( v => v % 2 == 1 );
等价于
arr.filter( function ( v ) {
return v % 2 == 1;
} );
filter: 在数组中筛选你需要的数据, 组成一个新数组( MDN 上找案例 ).
类比的案例: 有一个字符串数组, 将其中元素中含有 字符 e 的字符串取出来, 构成新数组
var arr = [ ‘e‘, ‘ab‘, ‘abcde‘, ‘abcdf‘ ];
// 语法:
var newArr = arr.filter(function ( v ) {
return v.indexOf( ‘e‘ ) > -1;
});
尝试使用自己的算法将其功能实现出来
function filter ( arr, callback ) {
var res = [];
for ( var i = 0; i < arr.length; i++ ) {
if ( callback( arr[ i ], i ) ) {
// 如果判断为真才会进入
res.push( arr[ i ] );
}
}
// 返回值? 是一个新数组
return res;
}
浅析ES5 中对数组遍历的5个扩展方法