专职C++

不能停止的脚步

  C++博客 :: 首页 :: 联系 :: 聚合  :: 管理
  163 Posts :: 7 Stories :: 135 Comments :: 0 Trackbacks

常用链接

留言簿(28)

我参与的团队

搜索

  •  

最新评论

阅读排行榜

评论排行榜

前面一篇,我们写了数组的基础,在这里则会把主要的方法和应用列出来. 

数组方法

检测数组 Array.isArray

ECMAScript 5 新增了 Array.isArray() 方法。这个方法的目的是最终确定某 
个值到底是不是数组,而不管它是在哪个全局执行环境中创建的。这个方法的用法如下。

  1. if (Array.isArray(value)){
  2. //对数组执行某些操作
  3. }

位置方法 indexOf和lastIndexOf


  • indexOf(searchvalue,fromindex) 从数组的头开始向后查找
  • indexOf和lastIndexOf(searchvalue,fromindex) 从数组的尾开始向前查找

接收两个参数:

  • searchvalue 要查找的项
  • fromindex (可选的)表示查找起点位置的索引 
    返回 
    要查找的项在数组中的位置,或者在没找到的情况下返回-1
  1. var data = [2, 5, 7, 3, 5];
  2. console.log(data.indexOf(5, "x")); // 1 ("x"被忽略)
  3. console.log(data.indexOf(5, "3")); // 4 (从3号位开始搜索)
  4. console.log(data.indexOf(4)); // -1 (未找到)
  5. console.log(data.indexOf("5")); // -1 (未找到,因为5 !== "5")

迭代方法

共有五个迭代方法every, filter, forEach, map, some 
每个方法的的参数是一个回调函数

迭代方法(function callback(item,index,array) {});

回调函数都是三个参数

  • item 数组的元素
  • index 元素在数组中的位置
  • array 数组对象本身 
    同时,有必要的回调函数要返回truefalse

  • every :对数组中的每一项运行给定函数,如果该函数对每一项都返回 true ,则返回 true 。相当于是每项做与操作
  • filter :对数组中的每一项运行给定函数,返回该函数会返回 true 的项组成的数组。
  • forEach :对数组中的每一项运行给定函数。这个方法没有返回值。
  • map :对数组中的每一项运行给定函数,返回每次函数调用的结果组成的数组。
  • some :对数组中的每一项运行给定函数,如果该函数对任一项返回 true ,则返回 true 。相当于是每项做或操作

例如:

every

  1. let a = [1,2,3,99,34,33];
  2. let v1 = a.every((item,index,array)=>{
  3. return item > 2;
  4. });
  5. //v1的值为false 因为a[0],a[1]不合条件
  6. let v2 = a.every((item,index,array)=>{
  7. return item > 0;
  8. });
  9. //v2的值为true

filter

  1. let a = [1,2,3,99,34,33];
  2. let v = a.filter((item,index,array)=>{
  3. return item > 2;
  4. });
  5. //v是过滤后的新数组 [3,99,34,33]

foreach

  1. a.forEach((item)=>{
  2. console.log(item);
  3. });
  4. //会依次打印出每个元素的值
  5. a.forEach((item,index)=>{
  6. console.log(index,item);
  7. });
  8. //会依次打印出每个元素的下标和值

map

  1. let a = [1,2,3,99,34,33];
  2. let v = a.map((item,index,array)=>{
  3. return item * item;
  4. });
  5. //v是map后的新数组 [1,4,9,9801,1156,1089]

some

  1. let a = [1,2,3,99,34,33];
  2. let v1 = a.some((item,index,array)=>{
  3. return item > 2;
  4. });
  5. //v1的值为true 因为a[2],a[3]等元素值>2
  6. let v2 = a.some((item,index,array)=>{
  7. return item > 100;
  8. });
  9. //v2的值为false ,因为没有元素值大于100

归并方法


  • reduce 从左到右累加
  • reduceRight 从右到左累加

这两个方法,都会遍历所有数组元素 
参数是一个回调函数

归并方法 (function callback(prev, cur, index, array){});

  • prev 前一个值
  • cur 当前元素
  • index 该元素在数组中的位置
  • array 数组对象本身

    例子

  1. let a = [1,2,3,99,34,33];
  2. let s = a.reduce((pre,cur,index,array)=>{
  3. console.log(pre,cur,index);
  4. return pre+cur;
  5. });
  6. //1 2 1t REPLServer.<anonymous> (repl.js:538:10)
  7. //3 3 2t emitOne (events.js:101:20)
  8. //6 99 3 REPLServer.emit (events.js:188:7)
  9. //105 34 4
  10. //139 33 5

数组栈方法

数组可以像栈那样使用 
push方法,表示在数组最后加入指定的元素,可以一次增加多个数组 
pop方法,表示将数组的最后一个删除,并通过pop方法返回,如果没有元素了,则返回undefined

  1. a.push(100);
  2. a.push(99);
  3. console.log(a.pop());
  4. console.log(a.pop());

结果输出 
99 
100

队列方法

数组可以像队列那样使用 
用push方法,在队尾加元素 
用shift在队头取元素 
用unshift在队头推入元素

  1. let a=[];
  2. a.push(1,2,3);
  3. Console.log(a.shift());
  4. Console.log(a.shift());
  5. Console.log(a.shift());

然后显示为1,2,3刚好和栈相反

  1. let a = [1,2,3];
  2. a.unshift(4);
  3. a.unshift(5,6,7);

结果a为[ 5, 6, 7, 4, 1, 2, 3 ]

反转数组方法

用reverse方法,反转数组 
如:

  1. let a = [1,2,3,4,5];
  2. a.reverse()

结果: 
[ 5, 4, 3, 2, 1 ]

排序

用sort可以对数组排序

  1. function compare(v1,v2) {
  2. return v1>v2;
  3. }
  4. // a.sort();默认将元素用toString,再比较字符串排序
  5. let a=[2,22,222,1,11,111];
  6. let v1 = a.sort();
  7. //则v1=[1,11,111,2,22, 222]
  8. //**这是不是按数值大小来排序,是按字会串大小来的**
  9. //可以指定的比较方法a.sort(compare);
  10. //则结果如下:
  11. let v2 = a.sort(compare);
  12. //则v2 = [ 1, 2, 11, 22, 111, 222 ]

连接数组

用concat可以将一个或多数组连起来,并不会改变当前数组本身

  1. a = [1,2,3];
  2. b = a.concat(99); //b=[1,2,3,99];
  3. B = a.concat(99,[4,5]); //b=[1,2,3,99,4,5];

基于原有数组创建新数组

用slice基于当前数组中的一或多个项创建一个新数组,原数组不会变 
slice(开始下标,结束下标) ; 并不包括结束下标的那个元素

  1. let a = [1,2,3,4,5,6];
  2. b=a.slice(2,4); //b=[3,4];

强大的splice

这个方法恐怕要算是最强大的数组方法了 
splice的返回值,则操作后的元素组成的数组

删除

可以删除任意数量的元素,只需指定 2个参数:

  • startIndex 开始删除的位置
  • removeCount 要删除的元素个数。 
    例如, a.splice(0,2) 会删除数组中的前两元素。
  1. let a = [1,2,3,4,5,6];
  2. let b = a.splice(1,2);
  3. //执行后,结果是
  4. //a = [ 1, 4, 5, 6 ]
  5. //b = [ 2, 3 ]

插入

可以向指定位置插入任意数量的元素,只需提供 3个参数:

  • 起始位置、
  • 0(要删除的元素个数,做为插入功能,这值必须为0)
  • 要插入的元素
  • 如果要插入多个元素, 
    还可以继续提供参数,表示是要插入的元素。 
    例如,
  1. let a = [1,2,3,4,5,6];
  2. let b = a.splice(1,0,91,92,93,94);
  3. //执行后结果是
  4. //a = [ 1, 91, 92, 93, 94, 2, 3, 4, 5, 6 ]
  5. //b = [ ]

替换

可以向指定位置插入任意数量的元素,且同时删除任意数量的元素,只需指定 3 个参数:

  • 起始位置、
  • >0的值(要删除的元素个数,做为替换功能,这值必须大于0)
  • 要插入的元素
  • 如果要插入多个元素, 
    还可以继续提供参数,表示是要插入的元素。
  1. let a = [1,2,3,4,5,6];
  2. let b = a.splice(1,2,91,92,93,94);
  3. //执行后结果是
  4. //a = [ 1, 91, 92, 93, 94, 4, 5, 6 ]
  5. //b = [ 2, 3 ]

最后

对于迭代方法和归并方法只是一个简化代码的作用,可能这些方法功能非常见,所以干脆默认提从了这两组方法。对于js的数组,使用起来非常方法,相比c/c++真是无与伦比…。在C++11标准后,也可以同样提供一个强大的动态数组。但是js的数组,可以存放任何元素,这个是C++不能比的,虽然可以实现,但是代价就有点大了。相对来说,现在版本的java和C#,则可以。因为java所有的都是Object…

posted on 2017-03-07 18:03 冬瓜 阅读(1472) 评论(0)  编辑 收藏 引用 所属分类: javascript

只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   博问   Chat2DB   管理