前言
JavaScript中的数据类型分为基本数据类型(Undefined、Null、Bollean、Number和String)和引用类型(Object、Function、Array等)。从直观上看,前者是最基本的数据构成单位,不能再分割为更小的数据单位了;后者则是由基础数据类型构成的复杂数据组合。再从编程角度上看,变量赋值的情况不同。
var a = 3;
var b = a;
console.log(a,b); // 3 3
a = 4;
console.log(b); // 3
上述代码所示,首先声明变量a,并初始化赋值3。再声明变量b,并且将a的值赋值给b,注意这里是按值传递,意思就是指,将变量a的值复制一份给变量b,至此,变量a和变量b的值虽然都是3,但是相互独立,互不相关。
var c = [1,2,3];
var d = c;
console.log(c,d); // [1,2,3] [1,2,3]
c.pop();
console.log(c,d) // [1,2] [1,2]
再看上面一段代码,声明变量c,赋值[1,2,3],然后声明变量d=c。这里就不是按值传递了,而是按引用传递,也就是C语言中的指针,变量d和c指向都是同一个数组,复制的只是存储数组地址的指针。所以当将c移除一个元素之后,d的值也会发生改变。
接下来步入正题,当我们使用数组存储数据时,经常会遇到对数据进行筛选过滤和基于某个条件判定正误的需求。例如目前存在一个数组a,里面存储了八步小学所有小学的学生年龄。在进行某个业务处理时,我需要判断: 1、这个数组中是否有小于6岁的学生;2、获取10岁-13岁年龄段学生个数。为了获取上述两个问题的结果,我们在代码层次上需要做的就是对数组进行遍历。JS本身提供了相关的API,下面总结一下。
filter()
filter()方法,顾名思义,用于数组中的元素筛选。该方法需要传入一个函数,建议使用es6箭头函数写法,更加简洁优雅。函数的参数等说明查阅MDN。该方法会遍历数组每一个元素,并对每个元素应用该函数,返回符合函数条件的元素组成的新数组。
let a = [
{
name: 'white',
category: 'dog'
},
{
name: 'yellow',
category: 'snake'
},
{
name: 'black',
category: 'cat'
},
{
name: 'purple',
category: 'bird'
},
{
name: 'white',
category: 'dog'
}
]
const r1 = a.filter((item,index,arr) => item.name.length == 5)
console.log(r1)
// 返回值
[
{ name: 'white', category: 'dog' },
{ name: 'black', category: 'cat' },
{ name: 'white', category: 'dog' }
]
find()
find()的含义就如名字一样,是查找符合条件的元素,返回符合条件的第一个元素,然后停止后面元素的遍历。即使后面还有其他符合条件的元素,也不会返回更多。
let a = [
{
name: 'white',
category: 'dog'
},
{
name: 'yellow',
category: 'snake'
},
{
name: 'black',
category: 'cat'
},
{
name: 'purple',
category: 'bird'
},
{
name: 'white',
category: 'dog'
}
]
const r2 = a.find(item => item.name == 'white')
console.log(r2) // { name: 'white', category: 'dog' }
map()
map()的含义是映射,该方法也需要传入一个函数,然后对数组中的每一个元素应用函数,返回改造后的新元素组成的新元素,不改变原数组。
forEach()
forEach()同样是对数组的每个元素应用某种操作,但是没有返回值,因为会直接改变原数组。本质上就相当于for循环。
every()
every()方法对数组中每一项运行回调函数,如果都返回true,every返回true,
如果有一项返回false,则停止遍历 every()返回false;不写默认返回false。
some()
some()方法对数组中每一项运行回调函数,如果该函数对某一项返回true,则some()返回true;
网友评论