饥人谷学习进阶第 7 天
Array.isArray(obj)
Array对象的一个静态函数,用来判断一个对象是不是数组
var a = [ ];
console.log(Array.isArray(a)); // true
.indexOf(element)/.lastIndexOF(element)
这两个方法用于查找数组内指定元素位置,查找到第一个后返回其索引,没有查找到返回-1,indexOf从头至尾搜索,lastIndexOf反向搜索。
var arr = [ 1,2,6,4,3,9,2,4 ]
arr.indexOf(2); // 1
arr.lastIndexOf(2); // 6
.forEach(element,index,array)
遍历数组(可改变原数组),参数为一个回调函数,回调函数有三个参数:
- 当前元素
- 当前元素索引值
- 整个数组
var arr = [ 1,2,3,4 ]
arr.forEach(function(v,index,array) {
array[index] = v*v;
});
console.log(arr); // [ 1,4,9,16 ]
.every(function(element,index,array))/.some(function(element,index,array))
这两个函数类似于离散数学中的逻辑判定,回调函数返回一个布尔值
- every是所有函数的每个回调函数都返回true的时候才会返回true,当遇到false的时候终止执行,返回false
- some函数是“存在”有一个回调函数返回true的时候终止执行并返回true,否则返回false
var arr = [ 1,0,2,5,3 ]
arr.every(function(v,index,arr) {
return v >= 0;
// (如果替换成) return v > 0;
}) // true (false)
arr.some(function(v,index,arr) {
return v > 0;
// (如果替换成) return v < 0;
}) // true (false)
在空数组上调用every返回true,some返回false。
.map(function(element))
与forEach类似,遍历数组,回调函数返回值组成一个新数组返回,新数组索引结构和原数组一致,原数组不变
var arr = [ 2,3,4,5,6 ]
console.log(arr.map(function(v) {
return v - 1;
})) // [ 1,2,3,4,5 ]
console.log(arr); // [ 2,3,4,5,6 ]
.filter(function(element))
返回数组的一个子集,回调函数用于逻辑判断是否返回,返回true则把当前元素加入返回数组中,false则不加
新数组只包含返回true的值,索引缺失的不包括,原数组保持不变
var arr = [ 2,6,-3,1,8,-1 ]
console.log(arr.filter(function(v) {
return v < 0;
})) // [ -3,-1 ]
console.log(arr); // [ 2,6,-3,1,8,-1 ]
.reduce(function(v1, v2), value) / .reduceRight(function(v1, v2), value)
遍历数组,调用回调函数,将数组元素合成一个值,reduce从索引最小值开始,reduceRight反向,方法有两个参数
- 回调函数:把两个值合为一个,返回结果
- value,一个初始值,可选
var arr = [ 1,2,3,4 ]
var b = arr.reduce(function(v1,v2) {
return v1 + v2;
})
console.log(b); // 10
b = arr.reduceRight(function(v1,v2) {
return v1 - v2;
},100)
console.log(b); // 90
深入
实现一个reduce函数,作用和原声的reduce类似
function reduce(arr, fn, initValue) {
var tmpArr = (initValue === undefined ? [ ] : [initValue]).concat(arr);
while (tmpArr.length > 1) {
tmpArr.splice(0, 2, fn (tmpArr[0],tmpArr[1]))
}
return tmpArr[0];
}
var sum = reduce([1,1,1], function (v1,v2) {
return v1 + v2;
}, 100)
console.log(sum); // 103
实现一个flatten函数,将一个嵌套多层的数组array(嵌套可以是任何层数)转换成只有一层的数组,数组中元素仅基本类型的元素或数组,不存在循环引用的情况。
function flatten(arr) {
return arr.reduce(function(initArr,currentArr) {
return initArr.concat(Array.isArray(currentArr) ? flatten(currentArr) : currentArr)
}, [ ])
}
function flatten2(arr) {
var newArr = [ ];
function _flat(arr) {
arr.forEach(function(val) {
if (Array.isArray(val)) {
_flat(val)
} else {
newArr.push(val)
}
})
}
_flat(arr);
return newArr;
}
网友评论