如何获取数组的最值以及合并数组

  1. 获取数组的最大值
    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中的扩展运算符

  1. 获取数组的最小值
    同数组的最大值

总结:求取数组的最值,数组中的元素尽量都是number, 如果出现number和string同时存在的情况比较的结果将并不准确(并不是按照ACII码进行比较)。如果非要进行ASCII码的比较,先将数组中的元素都转换成string类型。

  1. 数组合并

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值