被Arr Object遗忘的孩子:Arr.filter()

前言
前两天有天不在公司,项目测试中的优化需求被老司机接了招,我通过手机看到需求内容:当所有设备属性为不在线时,显示一条提示出来。很简单的一个小优化,我惯性的思路只是想到了将接口取得的数据——一个数组,其中有多个对象元素,来进行循环,事先准备一个变量,赋个初始值true,在循环中判断 online 属性值是否为true,只要有为true的,就改变变量的值,如果执行完整个 $.ench() , 变量值还未被改变说明没有在线设备,也就是全部离线。

类似如下代码:(项目使用了angular , jQuery)

var arr = [{ // 模拟接口数据
    name:'111',
    online:'false'
},{
    name:'222',
    online:'false'
},{
    name:'333',
    online:'false'
}];

var $scope.allOffline = true;   //提示元素 ng-if = "allOffline"
$.each(arr,function(i,o){
    if(o.online == "true"){  //只要有一个在线的,就变为false
        $scope.allOffline = false;
    }
});
// 如果整个each走完,allOffline值还为true,那么说明没走if,也就是全部离线

貌似是行得通的,具体实现不再细究。如有问题欢迎大家讨论~

第二天来到公司,看到老司机的代码,正是使用了数组对象的 filter() 方法。我不知道什么原因,w3c School 里
数组对象手册中,完全找不到 Arr.filter() 方法 ,于是我对它的认识还比较陌生。现在就来掌握它吧!

初识 Arr.filter():这个”孩子“有什么用?
filter() 是数组对象的方法,顾名思义,它可以根据条件筛选(或过滤)出符合条件的数组元素,并将筛选出的元素放到一个新的数组中,且把这个新的数组(其中的元素是符合筛选条件的元素)返回。

举个栗子:

var arr = [12,45,85,64,90,37];
var result = arr.filter(function(n){
    return n>=50;
});
console.log(result);  // [85, 64, 90]

使用 Arr.filter():这个”孩子“怎么使用?
Arr.filter() 方法接收一个必须的参数,这个参数是一个函数,数组中的每个元素都会执行这个函数。此函数参数可以接收 3 个参数:
第1个:代表调用 filter() 方法的数组元素中的每一个元素;
第2个:代表这个数组元素在原数组中的索引值;
第3个:代表调用 filter() 方法的数组对象本身;
再举个栗子:

var arr = [12,45,85,64,90,37];
var result = arr.filter(function(n,i,arr){
    console.log(n);  // n 代表数组中的每个元素
    console.log(i);  // i 代表每个元素的索引
    console.log(arr); // arr 代表调用 filter() 方法的数组本身
    return n>=50;
});
输出:
12
0
[12, 45, 85, 64, 90, 37]
45
1
[12, 45, 85, 64, 90, 37]
85
2
[12, 45, 85, 64, 90, 37]
……

老司机的代码
看看老司机是怎么使用 Arr.filter() 的,是不是比我最初的思路高明多了?

var offlineDevices=$scope.data.filter(function(device){
    return !device.online;
});
if(offlines&&offlines.length==$scope.devices.length){
    $scope.isAllOffline=true;
}else{
    $scope.isAllOffline=false;
}

时刻记得这个“被遗忘的孩子”
个人感觉 Arr.filter() 方法还是很好用的,在一些适合使用的情境下会发挥淋漓尽致的作用,所以时刻记得它吧!更多关于 Arr.filter() 的资源,可以参考:
1.菜鸟网站JavaScript Array filter() 方法
http://www.runoob.com/jsref/jsref-filter.html
2.数组的filter方法
http://www.cnblogs.com/luxiaoxiao/p/6067125.html

后记絮语
通过 ng-if 将变量和元素的创建/销毁联系在一起,也就是由变量来决定DOM元素的创建或销毁,这在angular中是很基础的知识。但细微处见真功夫,
如果是我写代码,基本就这样写了:

<span ng-if="isAllOffline">全部设备不在线</span>

再看老司机的代码:

<span ng-if="isAllOffline&&devices&&devices.length>0">全部设备不在线</span>

devices 代表所有设备,这就排除了设备数为0的情况,考虑很周到,值得学习。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值