var hege = ["Cecilie", "Lone"];
var stale = ["Emil", "Tobias", "Linus"];
var kai = ["Robin"];
var children = hege.concat(stale,kai);
console.log(children) //打印["Cecilie", "Lone","Emil", "Tobias", "Linus","Robin"]
var deepArr = stale.concat([]);//数组深拷贝;
deepArr.push('Denzel');
console.log(deepArr); //打印["Emil","Tobias", "Linus","Denzel"]
console.log(stale); //打印["Emil", "Tobias", "Linus"];
var color =['a','b','e','d','c','f'];
color.sort();
console.log(color);//打印[a,b,c,d,e,f]
var num =[1,3,2,12,24,5,7,19];
num.sort(); //这将证明上面提到的根据每个数组项的toString()后根据字典顺序进行排序
console.log(num);//打印[1, 12, 19, 2, 24, 3, 5, 7]
写于:2017-11-30
前言
最近工作做数据交互展示,常和数据打交道,而随之而来的就是遇见后端传来的各种各样的数组,我需要用各式各样的方法来变换这些数据,来最好的展示这些数据;很多东西久了没用就容易忘,自己也是边查边用,这篇文章算是自己这一周学习的知识的总结。当然你也可以打看MSDN查看更标准的叙述
数组原生的API
那些需要知道的特性:
API之增删查改
我以前听说增删查改(CRUD),是sql语言。但有一次参加面试,面试官问:说说你知道的JS数组增删查改,那数组的增删查改是那些呢?说真的,当时我一脸懵逼,我还以为数组还能用sql语句操作
其实前面都不复杂,复杂的是参数为负的时候,规则是这样的(来源于MSDN):如果 start 为负,则将其视为 length + start,其中 length 为数组的长度。如果 end 为负,则将其视为 length + end,其中 length 为数组的长度。如果省略 end,则将一直提取到 arrayObj 的结尾。如果 end 出现在 start 之前,则不会将任何元素复制到新数组中。
arr.splice(2,0, '11','12');//这个操作删除了0个元素,添加了11,12,相当于增,其结果[1, 2, "11", "12",3,4,5,6];
arr.splice(2,2, );//这个操作删除了2个元素,添加了0个元素,相当于删,其结果[1, 2, "11", "12",3,4,5,6],相当于增加;
如果你想让上面的数据进行升序或者降序进行排序,你需要自己写一个比较函数,即这样:
API之循环遍历
也许你已习惯了for循环,或者你对jquery的each方法已经产生了依赖,或许你应该接触点新知识了,毕竟ES6已经不算新了;ES7已经开始被支持了;而你还不知道用ES5的map,some,every,filter来循环遍历你的数组,甚至是forEach。
对于上面5个方法,都有类似的回调参数(item,index,array),试着从一个例子来了解他们,一个简单的例子显得有些苍白。假如现在我们有这样一个需求,已知某个四川省某个景区今日接待旅客总人数10000人,然后从购票信息获取到前十名的省份和人数,我们想计算这些省份每个所占比例,并把他们的人数用一个数组单独保存下来,用来找最大值,最小值,我们试着不用for循环来解决这个问题;
短短四行代码就完成了这两个需求,如果我们只想要第2名到第9名的数据(即去掉一个最高分,去掉一个最低分)拿来做分析,所以根绝前面抽离出来的数组,我们再借助sort()和filter()来完成这个需求:
通过上面两个例子,也许你应该已经体会到了这些原生数组API的作用了,他们在数据处理中,优势非常大,但也不能说,以后就可以完全不依赖ofr循环了,还是很难,上面五个方法有一个通病,就是无法中止遍历,即在循环中break,break一些遍历查找中,还是相当省时,这也是为啥有时我们还是需要for循环来做一些操作. 至于some,every,foreach,你可以自己动手感受一下。 别总是沉溺于已会的那点知识,别总依赖框架,插件。用好原生API,你的代码将显得干净,有趣。