- 获取数组的最大值
ES5写法
- Math.max.apply()
var arr1 = [1, 2, 3];
var max1 = Math.max.apply(null,arr1); //max3值为3
上述max1得到的结果是3,如果数组中包含字符串的话:
var arr2 = ['1', 2, 3];
var max2 = Math.max.apply(null,arr2); //max3值为3
可以看到,数组中的字符串先被转换成了number类型,然后再进行比较,因此得到的结果仍然是3。如果字符串不能被转换成正确的数字,即NaN,那么得到的最大值结果也是NaN,如:
var arr3 = ['a', 2,3];
var max3 = Math.max.apply(null,arr3); //max3值为NaN
这里要注意的是Math.max.apply()的第一个参数可以是任意值。
- reduce方法
var arr1 = [1, 2, 3];
var arr2 = ['1', 2, 3];
var arr3 = ['a', 2,3];
var max1 = arr1.reduce(function(prev, cur, index) { //max1的结果是3
return prev>cur?prev:cur
})
var max2 = arr2.reduce(function(prev, cur, index) { //输出的结果是3
return prev>cur?prev:cur
})
var max3 = arr3.reduce(function(prev, cur, index) { //输出的结果仍然是3
return prev>cur?prev:cur
})
这里要注意的是用>号进行比较的时候,涉及到js中的隐式类型转换,在>(或>=,<,<=)的左右两边不全是字符串的时候,js会将操作符两边的操作数尽量转化成number类型,‘a’转化成number类型得到NaN,而NaN与任何其他操作数相比都会返回false,因此最后得到的结果依然是3。
ES6写法
var max1 = Math.max(...arr1) //得到3
var max2 = Math.max(...arr2) //得到3
var max3 = Math.max(...arr3) //得到NaN
这里用到的是ES6中的扩展运算符。
- 获取数组的最小值
同数组的最大值
总结:求取数组的最值,数组中的元素尽量都是number, 如果出现number和string同时存在的情况比较的结果将并不准确(并不是按照ACII码进行比较)。如果非要进行ASCII码的比较,先将数组中的元素都转换成string类型。
- 数组合并
ES5写法
- concat
var arr1 = [1, 2, 3];
var arr2 = ['1', 2, 3];
var arr3 = arr1.concat(arr2) //arr3结果为 [1, 2, 3, "1", 2, 3], arr1和arr2为原值
这是最耗费内存的方法,如果arr1和arr2这两个数组都很大的话,需要为arr3重新开辟一块更大的内存来存放arr1和arr2的内容。
- push
var arr1 = [1, 2, 3];
var arr2 = ['1', 2, 3];
var n = Array.prototype.push.apply(arr1, arr2) //arr1结果[1, 2, 3, "1", 2, 3],arr2结果["1", 2, 3], n结果为6
或者下面的写法可以达到一样的效果:
var arr1 = [1, 2, 3];
var arr2 = ['1', 2, 3];
var n = arr1.push.apply(arr1, arr2) //arr1结果[1, 2, 3, "1", 2, 3],arr2结果["1", 2, 3], n结果为6
以上arr1是合并后的数组,n是合并后数组的length值,arr2不变。这样的好处是不必需要额外的空间来存储第三个数组用来存放arr1和arr2的和数组。
ES6写法
当然是采用扩展运算符啦!
var arr1 = [1, 2, 3];
var arr2 = ['1', 2, 3];
var n = arr1.push(...arr2)
这里如果考虑到效率问题:
如果arr2数组元素数目比arr1数组中元素多,又要保证合并后的数组中arr1中的元素在arr2数组元素之前,那么可以考虑用unshift方法将arr1数组元素插入arr2数组的前面,以提高效率:
var n = Array.prototype.unshift.apply(arr2, arr1)
var n = arr2.unshift.apply(arr2, arr1)
var n = arr2.unshift(...arr1)
如果考虑到arr1和arr2数组元素过多,实际上不管是push/unshift的apply方法,还是ES6的扩展运算符结合push/unshift的方法,不可避免的问题是:被操作的那个数组(apply方法的第二个参数或用扩展运算符扩展的那个数组)如果达到百万级别的话,很可能超过函数参数可以达到的最大数量(每种js引擎的限制可能不同),因为在调用函数传参的过程中,如果参数是数组的话,其中的每个元素会被展开成函数的一个个参数,这里就会遵循一个最大参数数量的限制。
因此,如果要避免函数参数个数限制这个问题的话,可以采用concat方法(但是会生成一个新的数组,会需要更多的内存),因此这里也可以采用以下原始的reduce方法:
var arr1 = [1, 2, 3];
var arr2 = ['1', 2, 3];
var arr1 = arr2.reduce(function(prev, cur, index) {
prev.push(cur);
return prev
}, arr1)
或者reduceRight的方法:
var arr1 = [1, 2, 3];
var arr2 = ['1', 2, 3];
var arr2 = arr1.reduceRight(function(prev, cur, index) {
prev.unshift(cur);
return prev;
}, arr2)
总结:请根据你的具体需求选择合适的获取数组最值和合并数组的方法,毕竟变成的本质就是数据的流动,同时寻求空间和效率的平衡。
参考:https://blog.csdn.net/renfufei/article/details/39376311