[TOC]
阵列处理技巧是JavaScript 中非常重要的一块,现在框架大乱斗的时代,框架基本上对于DOM 的处理都有属于自己一套良好的方法。只要能够对于阵列资料操作熟悉,配合框架就能够将开发效率更上层楼。
本篇介绍到的方法有:
```
filter()
find()
forEach()
map()
every()
some()
reduce()
```
直接点上方连结就能跳到指定区域
初始资料
本篇都是使用同一份阵列资料,当然你也可以把相关的函式直接贴在jsbin 或codepen 上就能看到结果,因为篇幅已经很长了,所以就不在另外补上范例档。
```
// 相同的阵列
var people = [
{
name : 'Casper' ,
like : '锅烧意面' ,
age : 18
},
{
name : 'Wang' ,
like : '炒面' ,
age : 24
},
{
name : 'Bobo' ,
like : '萝卜泥' ,
age : 1
},
{
name : '卤蛋' ,
like : '萝卜泥' ,
age : 3
}
];
```
## Array.prototype.filter()
filter() 会回传一个阵列,其条件是return 后方为true 的物件,很适合用在搜寻符合条件的资料。
```
var filterEmpty = people.filter( function ( item, index, array ) {
});
console .log(filterEmpty); //没有条件,会是一个空阵列
var filterAgeThan5 = people.filter( function ( item, index, array ) {
return item.age > 5 ; //取得大于五岁的
});
console .log(filterAgeThan5); // Casper, Wang这两个物件
var filterDouble = people.filter( function ( item, index, array ) {
return index % 2 === 1 ; //取得阵列中双数的物件
});
console .log(filterDouble); // Wang,卤蛋这两个物件
```
## Array.prototype.find()
find()与filter()很像,但find() 只会回传一次值,且是第一次为true的值。
```
var findEmpty = people.find( function ( item, index, array ) {
});
console .log(findEmpty); //没有条件,会是undefined
var findAgeThan5 = people.find( function ( item, index, array ) {
return item.age > 5 ; //取得大于五岁的
});
console .log(findAgeThan5); //虽然答案有两个,但只会回传Casper这一个物件
var findLike = people.find( function ( item, index, array ) {
return item.like === '萝卜泥' ; //取得阵列like === '萝卜泥'
});
console .log(findLike); //虽然答案有两个,但只会回传第一个Bobo物件
```
## Array.prototype.forEach()
forEach 是这几个阵列函式最单纯的一个,不会额外回传值,只单纯执行每个阵列内的物件或值。
```
var forEachIt = people.forEach( function ( item, index, array ) {
console .log(item, index, array); //物件,索引,全部阵列
return item; // forEach没在return的,所以这边写了也没用
});
console .log(forEachIt); // undefined
people.forEach( function ( item, index, array ) {
item.age = item.age + 1 ; // forEach就如同for,不过写法更容易
});
console .log(people); //全部age + 1
```
## Array.prototype.map()
使用map() 时他需要回传一个值,他会透过函式内所回传的值组合成一个阵列。
如果不回传则是 undefined
回传数量等于原始阵列的长度
这很适合将原始的变数运算后重新组合一个新的阵列。
```
var mapEmpty = people.map( function ( item, index, array ) {
});
console .log(mapEmpty); // [undefined, undefined, undefined, undefined]
var mapAgeThan5 = people.map( function ( item, index, array ) {
return item.age > 5 ; //比较大于五岁的
});
console .log(mapAgeThan5); // [true, true, false, false]
var mapAgeThan5_2 = people.map( function ( item, index, array ) {
// 错误示范
if (item.age > 5 ) {
return item; //回传大于五岁的
}
return false ; //别以为空的或是false就不会回传
});
console .log(mapAgeThan5_2); // [{name: 'Casper'...}, {name: 'Wang'...}, false, false]
var mapEat = people.map( function ( item, index, array ) {
if (item.like !== '萝卜泥' ) {
return ` ${item.like}好吃` ;
} else {
return ` ${item.like}不好吃` ;
}
});
console .log(mapEat); // ["锅烧意面好吃", "炒面好吃", "萝卜泥不好吃", "萝卜泥不好吃"]
```
## Array.prototype.every()
every()可以检查所有的阵列是否符合条件,这仅会回传一个值trueor false,可以用来检查阵列中的内容是否符合特定条件。
```
var array = [
{
name : 'Casper' ,
like : '锅烧意面' ,
age : 18
},
{
name : 'Wang' ,
like : '炒面' ,
age : 24
},
{
name : 'Bobo' ,
like : '萝卜泥' ,
age : 1
},
{
name : '卤蛋' ,
like : '萝卜泥' ,
age : 3
}
];
var ans = array.every( function ( item, index, array ) {
console .log(item, index, array); //物件,索引,全部阵列
return item.age > 10 //当全部age大于10才能回传true
});
console .log(ans); // false:只要有部分不符合,则为false
var ans2 = array.every( function ( item, index, array ) {
return item.age < 25
});
console .log(ans2); // true:全部age都小于25
```
## Array.prototype.some()
some() 与every() 非常接近,都是回传true or false,差异仅在every() 需完全符合,some() 仅需要部分符合。
```
var ans = people.some( function ( item, index, array ) {
return item.age > 10 //当全部age大于10才能回传true
});
console .log(ans); // true:只要有部分符合,则为true
var ans2 = people.some( function ( item, index, array ) {
return item.age < 25
});
console .log(ans2); // true:只要有部分符合,则为true
var ans2 = people.some( function ( item, index, array ) {
return item.age > 25
});
console .log(ans2); // false:全部都不符合则为false
```
## Array.prototype.reduce()
reduce() 和其他几个差异就很大了,他可以与前一个回传的值再次作运算,参数包含以下:
accumulator: 前一个参数,如果是第一个阵列的话,值是以另外传入或初始化的值
currentValue: 当前变数
currentIndex: 当前索引
array: 全部阵列
```
var reduceEmpty = people.reduce( function ( accumulator, currentValue, currentIndex, array ) {
});
console .log(reduceEmpty); //没有条件,会是undefined
var reducePlus = people.reduce( function ( accumulator, currentValue, currentIndex, array ) {
// 分别为前一个回传值, 目前值, 当前索引值
console .log(accumulator, currentValue, currentIndex);
return accumulator + currentValue.age; //与前一个值相加
}, 0 ); //传入初始化值为0
console .log(reducePlus); //总和为46
var reducePlus = people.reduce( function ( accumulator, currentValue, currentIndex, array ) {
console .log( 'reduce' , accumulator, currentValue, currentIndex)
return Math .max( accumulator, currentValue.age ); //与前一个值比较哪个大
}, 0 );
console .log(reducePlus); //最大值为24
```
reduce()的使用方法更为丰富,想认识更详细可参考MDN。
## 其它
预设的阵列行为内的this是指向window (本篇中除了reduce()是传入初始资料),如果要改,可以在function后传入。
```
// arr.forEach(function callback(currentValue, index, array) {
// your iterator
// }[, thisArg]);
var ans3 = people.forEach( function ( item, index, array ) {
console .log( this ) //这边的this就会使用后方传入的
return item.age < 25
}, people); //传入的物件,替代this,如果无则是window
```
- 简介
- 两种结构对象和数组
- JSON对象和字符串转换
- JSON字符串转换为JSON对象
- JSON对象转换为JSON字符串
- 实例1-通用的JSON数组去重
- 实例2-根据某个字段实现对json数组的排序
- 实例3-JSON根据某一个字段进行筛选
- 实例4-去重后取出某一字段形成新结构
- 实例5-出发车站从json动态获取
- 数据操作
- 遍历
- 复制一个新JSON数组
- 实例6-点击checkbox动态筛选json
- 如何使用JS筛选JSON数据
- filter
- filter后数据变化
- json判断为空显示与否
- JavaScript 阵列处理方法[filter(), find(), forEach(), map(), every(), some(), reduce()]
- json_decode
- php 解决json_encode中文UNICODE转码问题
- js中判断返回的json字符串中是否有某个字段
- 如何获取json对象中的特定值
- 如何删除json中的某个变量key
- json将某一字段转化为字符串用逗号连接
- json的某一个键名作为键值
- 键名和键值
- 根据键名得到对应的键值三种方法
- 键名和键值分开作为一个新的json对象
- 键名作为变量
- field_as_key其中一个键名作为键值
- 遍历JSON、获取JSON长度的方法
- js的for循环不如$.each好用
- 常用函数
- 插件
- jsonsql
- js判断object里面是否包含某一字段
- 检测一个字符是否在数组中
- 判断json数据是否为空
- 两个JSON合并
- js如何将两个对象合并成一个对象
- 数组与对象的追加方式
- js数组去重(包括对象数组去重)
- JSON 元素的添加删除
- JavaScript对Json的增删改属性
- js删除json中指定的元素
- json中如何删除指定元素
- 如何在Javascript中动态创建字典和添加键值对
- JS 获取对象key
- js如何通过相同键值合并两个json数组
- 有相同键值的json合并为一个数组
- js判断一个数组是否包含另一个数组
- js将一个数组插入另一个数组
- js移除Array中指定元素
- 数组的操作
- 合并数组
- 去重数组