JavaScript array常用方法代码实例详解


Posted in Javascript onSeptember 02, 2020

1.map/reduce

map()

map()是array的一个方法

作用: 对array中每一个元素调用自定义函数

'use strict';
function pow(x){
return x*x;
}
var arr=[1,2,3,4,5]
var newarray=arr.map(pow)

map的回调函数有三个参数:

callback(currentValue, index, array)通常只要第一个参数

PS: map()传入的参数是pow,即函数对象本身

通常map调用的自定义方法只包含一个参数

reduce()

reduce()也是array的一个方法

作用: 从数组的前两个元素开始,作为函数参数,传入函数得到结果,

结果再和下一个数组元素再一次调用函数,直到数组尽头

[x1, x2, x3, x4].reduce(f) = f(f(f(x1, x2), x3), x4)
PS: 通常reduce()调用的自定义方法只包含两个个参数

2.filter(筛选)

作用:把Array的某些元素过滤掉,然后返回剩下的元素.

和map()类似,Array的filter()也接收一个函数。和map()不同的是,filter()把传入的函数依次作用于每个元素,然后根据返回值是true还是false决定保留还是丢弃该元素。

//去掉空字符串

var arr = ['A', '', 'B', null, undefined, 'C', ' '];
var r = arr.filter(function (s) {
  return s && s.trim(); // 注意:IE9以下的版本没有trim()方法
});
r; // ['A', 'B', 'C']

回调函数

通常我们仅使用第一个参数,表示Array的某个元素。回调函数还可以接收另外两个参数,表示元素的位置和数组本身:

var arr = ['A', 'B', 'C'];
var r = arr.filter(function (element, index, self) {
  console.log(element); // 依次打印'A', 'B', 'C'
  console.log(index); // 依次打印0, 1, 2
  console.log(self); // self就是变量arr
  return true;
});

筛选素数:

function get_primes(arr){
if(elem===1){
return false;
}
for(var i=2;i<=elem/2;i++){
if(elem%i==0)
{
return false;
}
}
return true;
});
return x;
}

PS: 关键在于正确实现一个“筛选”函数

3.sort(排序)

默认排序会把所有元素转成String在排序,根据一个元素的ASCII值进行排序(非递减)(TimSort算法)

两两比较,当回调函数返回值大于0时,交换元素值

自定义数字排序

'use strict' 
var arr=[10,20,1,2];
arr.sort(function(x,y){
	if (x < y) {
    return -1;
  }
  if (x > y) {
    return 1;
  }
  return 0;
});
console.log(arr); // [1, 2, 10, 20]

数字倒序排列

var arr = [10, 20, 1, 2];
arr.sort(function (x, y) {
  if (x < y) {
    return 1;
  }
  if (x > y) {
    return -1;
  }
  return 0;
}); // [20, 10, 2, 1]

4.其他的Array方法

every()和some()

作用: 可以判断数组的所有元素是否满足测试条件(通过函数提供)

every()是全部满足的时候返回true,一个不满足返回false,并终止检测

some()是全部不满足的时候返回false,有一个满足就返回true

find()

作用: 查找第一个符合条件的元素

查找符合条件的第一个元素,如果找到了就返回这个元素,否则,返回undefined

findindex()

作用: 查找第一个符合条件的元素的索引

查找符合条件的第一个元素,找到这个元素就返回他的索引,如果没有找到就返回-1

forEach()

作用: 常用于遍历数组

(和map类似)把数组每个元素依次传入函数,但不会返回新的数组.

函数作为返回值
函数里再定义一个函数,返回值为里面定义的函数

调用函数作为返回值的函数式,每次调用都会返回一个新的函数,即使传入相同参数

function lazy_sum(arr) {
  var sum = function () {
    return arr.reduce(function (x, y) {
      return x + y;
    });
  }
  return sum;
}
//此时返回的是求和函数
var f = lazy_sum([1, 2, 3, 4, 5]); // function sum()
f(); // 15 此时调用,才进行计算

在函数lazy_sum中又定义了函数sum,并且,内部函数sum可以引用外部函数lazy_sum的参数和局部变量,当lazy_sum返回函数sum时,相关参数和变量都保存在返回的函数中,这种称为“闭包(Closure)”的程序结构拥有极大的威力.

闭包(懵逼了)(吐彩虹)

有权访问另一个函数作用域内变量的函数都是闭包。

函数里面的函数会随着外部定义函数而改变

PS: 因为返回值就是一个函数,调用的时候要加小括号

返回闭包时牢记的一点就是:返回函数不要引用任何循环变量,或者后续会发生变化的变量。

如果一定要引用循环变量怎么办?方法是再创建一个函数,用该函数的参数绑定循环变量当前的值,无论该循环变量后续如何更改,已绑定到函数参数的值不变:

箭头函数(=>)(强哒)
(参数...)=>{函数体}等价于function(参数...){函数体}

当返回的是一个对象时函数体大括号外边加小括号

x=>({foo:x})

this

箭头函数内部的this是词法作用域,由上下文确定

var obj = {
  birth: 1990,
  getAge: function () {
    var b = this.birth; // 1990
    var fn = () => new Date().getFullYear() - this.birth; // this指向obj对象
    return fn();
  }
};
obj.getAge(); // 25

箭头函数完全修复了this指向,this总是指向词法作用域,也就是外层调用 obj

generator(生成器)

ES6引入借鉴Python同名函数

写法和函数类似,只是在function后加*,通过yield多次返回值,也可通过return返回值

函数在执行过程中,如果没有遇到return语句(函数末尾如果没有return,就是隐含的return undefined;),控制权无法交回被调用的代码。

function* (x){
yield x
}
function* fib(max) {
  var
    t,
    a = 0,
    b = 1,
    n = 0;
  while (n < max) {
    yield a;
    [a, b] = [b, a + b];
    n ++;
  }
  return;
}
fib(5); // fib {[[GeneratorStatus]]: "suspended", [[GeneratorReceiver]]: Window}

直接调用一个generator和调用函数不一样,fib(5)仅仅是创建了一个generator对象,还没有去执行它。

调用generator对象有两个方法,

一是不断地调用generator对象的next()方法:next()方法会执行generator的代码,然后,每次遇到yield x;就返回一个对象{value: x, done: true/false},然后“暂停”。返回的value就是yield的返回值,done表示这个generator是否已经执行结束了。如果done为true,则value就是return的返回值。当执行到done为true时,这个generator对象就已经全部执行完毕,不要再继续调用next()`了。

var f = fib(5);
f.next(); // {value: 0, done: false}
f.next(); // {value: 1, done: false}
f.next(); // {value: 1, done: false}
f.next(); // {value: 2, done: false}
f.next(); // {value: 3, done: false}
f.next(); // {value: undefined, done: true}

第二个方法是直接用for ... of循环迭代generator对象,这种方式不需要我们自己判断done:

for (var x of fib(10)) {
  console.log(x); // 依次输出0, 1, 1, 2, 3, ...
}

generator还有另一个巨大的好处,就是把异步回调代码变成“同步”代码。这个好处要等到后面学了AJAX以后才能体会到。

try {
  r1 = yield ajax('http://url-1', data1);
  r2 = yield ajax('http://url-2', data2);
  r3 = yield ajax('http://url-3', data3);
  success(r3);
}
catch (err) {
  handle(err);
}

看上去是同步的代码,实际执行是异步的。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
javascript实现的动态文字变换
Jul 28 Javascript
一个可拖拽列宽表格实例演示
Nov 26 Javascript
分享28款免费实用的 JQuery 图片和内容滑块插件
Dec 15 Javascript
node.js require() 源码解读
Dec 13 Javascript
jQuery中inArray方法注意事项分析
Jan 25 Javascript
input获取焦点时底部菜单被顶上来问题的解决办法
Jan 24 Javascript
浅谈js停止事件冒泡 阻止浏览器的默认行为(阻止超连接 #)
Feb 08 Javascript
详解Angularjs在控制器(controller.js)中使用过滤器($filter)格式化日期/时间实例
Feb 17 Javascript
关于foreach循环中遇到的问题小结
May 08 Javascript
发布一款npm包帮助理解npm的使用
Jan 03 Javascript
js cavans实现静态滚动弹幕
May 21 Javascript
Nuxt pages下不同的页面对应layout下的页面布局操作
Nov 05 Javascript
Vue前端判断数据对象是否为空的实例
Sep 02 #Javascript
详解JavaScript 事件流
Sep 02 #Javascript
JavaScript判断数据类型有几种方法及区别介绍
Sep 02 #Javascript
jQuery中getJSON跨域原理的深入讲解
Sep 02 #jQuery
JavaScript交换变量常用4种方法解析
Sep 02 #Javascript
Vue-cli打包后部署到子目录下的路径问题说明
Sep 02 #Javascript
Jquery $.map使用方法实例详解
Sep 01 #jQuery
You might like
PHP 反射机制实现动态代理的代码
2008/10/22 PHP
PHP最常用的ini函数分析 针对PHP.ini配置文件
2010/04/22 PHP
学习php笔记 字符串处理
2010/10/19 PHP
php URL验证正则表达式
2011/07/19 PHP
一个不易被发现的PHP后门代码解析
2014/07/05 PHP
PHP strip_tags() 去字符串中的 HTML、XML 以及 PHP 标签的函数
2016/05/22 PHP
PHP中的print_r 与 var_dump 输出数组
2016/06/13 PHP
javascript中比较字符串是否相等的方法
2013/07/23 Javascript
js实现星星打分效果的方法
2020/07/05 Javascript
JS实现的文字与图片定时切换效果代码
2015/10/06 Javascript
JS构造函数与原型prototype的区别介绍
2016/07/04 Javascript
jquery插件uploadify多图上传功能实现代码
2016/08/12 Javascript
js实现复选框的全选和取消全选效果
2017/01/03 Javascript
JavaScript mixin实现多继承的方法详解
2017/03/30 Javascript
js 事件的传播机制(实例讲解)
2017/07/20 Javascript
JS实现可视化文件上传
2018/09/08 Javascript
详解wepy开发小程序踩过的坑(小结)
2019/05/22 Javascript
原生js实现五子棋游戏
2020/05/28 Javascript
学习python (2)
2006/10/31 Python
python调用java模块SmartXLS和jpype修改excel文件的方法
2015/04/28 Python
浅谈python装饰器探究与参数的领取
2017/12/01 Python
同时安装Python2 &amp; Python3 cmd下版本自由选择的方法
2017/12/09 Python
Django使用中间件解决前后端同源策略问题
2019/09/02 Python
Python图片的横坐标汉字实例
2019/12/04 Python
网游商务专员求职信
2013/10/15 职场文书
动漫专业高职生职业生涯规划书
2014/02/15 职场文书
建筑设计专业求职自我评价
2014/03/02 职场文书
企业金融服务方案
2014/06/03 职场文书
小学校园广播稿(3篇)
2014/09/19 职场文书
战略性融资合作协议书范本
2014/10/17 职场文书
成本会计岗位职责
2015/02/03 职场文书
2015教师年度考核评语
2015/03/25 职场文书
2015年售票员工作总结
2015/04/29 职场文书
大学生违纪检讨书范文
2015/05/07 职场文书
小学三年级数学教学反思
2016/02/16 职场文书
实战Python爬虫爬取酷我音乐
2022/04/11 Python