在实际js开发中对数组操做频率很是高,看过一些小伙伴的一些用法,挺有意思,在这里小记(不全)一下,备忘。webpack
every()
:对数组中的每一项运行给定函数,若是该函数每一项都返回true
,则返回true
;filter()
:对数组中的每一项运行给定函数,返回该函数会返回true
的项组成的数组;forEach()
:对数组中的每一项运行给定函数,这个方法没有返回值;map()
:对数组中的每一项运行给定函数,返回每次函数调用的结果组成的数组;some()
:对数组中的每一项运行给定函数,若是该函数任意一项返回true
,则返回true
;// every var numbers = [1, 2, 3, 4, 5, 6, 7]; var everyResult = numbers.every(function (item, index, array) { return (item > 2); }); console.log(everyResult); // false // some someResult = numbers.some(function (item, index, array) { return (item > 2); }); console.log(someResult); // true // filter var filterResult = numbers.filter(function (item, index, array) { return (item > 2); }); console.log(filterResult); // [3, 4, 5, 6, 7] // map var mapResult = numbers.map(function (item, index, array) { return item * 2; }); console.log(mapResult); // [2, 4, 6, 8, 10, 12, 14]
一般状况下, map
方法中的 callback
函数只接受一个参数,就是正在被遍历数组元素自己。但不意味着 map
只给 callback
传一个参数,这种惯性思惟极可能会让咱们犯错。下面举一个例子:web
下面语句返回什么呢:
['1', '2', '3'].map(parseInt)
可能你会以为是 [1, 2, 3]
,但实际结果是 [1, NaN, NaN]
。segmentfault
map
回调方法 callback(currentValue, index, array)
有三个参数,第一个是数组中正在处理的当前元素,第二个是当前元素索引,第三个是数组自己。数组
Number.parseInt(string[, radix])
有两个参数,第一个是待转化字符,第二个是进制数。parseInt
传入第三个参数会被忽略。svg
所以,上述执行函数
parseInt('1', 0, ['1', '2', '3']) // 1 parseInt('2', 1, ['1', '2', '3']) // NaN parseInt('3', 2, ['1', '2', '3']) // NaN
匹配查找某个目录下的文件并引入。ui
context.require
返回一个 require
函数:spa
function webpackContext(req) { return __webpack_require__(webpackContextResolve(req)); }
该函数有一个 keys
属性,是一个函数,返回一个数组,该数组是由全部可能被上下文模块的请求对象组成。code
let requireAll = requireContext => requireContext.keys().map(requireContext) let req = require.context('./svg', false, /\.svg$/) requireAll(req)
这样经过 map
遍历,结合引入上下文对象做为回调函数,便可获取引入某个目录下的 svg
资源。对象
array.reduce(callback[, initialValue])
第一个参数是每一项上调用的函数,该函数有四个参数:
accumulator
:累加回调返回值;他是上一次调用时返回的累积值,或initValue
;currentValue
:数组中正在处理的元素;currentIndex
:数组中正在处理的当前元素的索引。若是提供了initialValue
,这索引号为0,不然索引为1;array
:调用reduce()
的数组。当第二个参数省略时,遍历从数组第二项开始,数组第一项被看成前一个值accumulator
。
数组求和
const numbers = [10, 20, 30, 40]; numbers.reduce((acc, cur, index, arr) => { console.log('acc: ' + acc + '; ' + 'cur: ' + cur + ';'); return acc + cur; })
结果为:
acc: 10; cur: 20; acc: 30; cur: 30; acc: 60; cur: 40;
这第二个参数就是设置accumulator
的初始类型和初始值,好比为0,就表示accumulator
的初始值为Number
类型,值为0,所以,reduce
的最终结果也会是Number
类型。
const numbers = [10, 20, 30, 40]; numbers.reduce((acc, cur, index, arr) => { console.log('acc: ' + acc + '; ' + 'cur: ' + cur + ';'); return acc + cur; }, 0)
结果为:
acc: 0; cur: 10; acc: 10; cur: 20; acc: 30; cur: 30; acc: 60; cur: 40;
reduce
做为归并方法,在有些情形能够替代其它数组操做方法,强大之处,还得要落实在具体的案例上。
假设如今有一个数列[10, 20, 30, 40, 50],每一项乘以2,而后筛选出大于60的项。
在这里更新数组每一项(map
的功能)而后筛选出一部分(filter
的功能),若是是先使用map
而后filter
的话,你须要遍历这个数组两次。在这里用reduce
更高效。
var numbers = [10, 20, 30, 40, 50]; var result = numbers.reduce(function (acc, cur) { cur = cur * 2; if (cur > 60) { acc.push(cur); } return acc; }, []); console.log(result); // [80, 100]
从这个例子能够看出reduce
完成了map
和filter
的使命。
统计数组中重复出现项的个数,用对象表示。
var letters = ['A', 'B', 'C', 'C', 'B', 'C', 'C']; var letterObj = letters.reduce(function (acc, cur) { acc[cur] = acc[cur] ? ++acc[cur] : 1; return acc; }, {}); console.log(letterObj); // {A: 1, B: 2, C: 4}
数组去重
var letters = ['A', 'B', 'C', 'C', 'B', 'C', 'C']; var letterArr = letters.reduce(function (acc, cur) { if (acc.indexOf(cur) === -1) { acc.push(cur); } return acc; }, []); console.log(letterArr); // ["A", "B", "C"]
ps:了解更多数组去重方法,点这里。
与ES6结合使用也会擦出很多火花。
删除目标对象某个属性。
const person = { name: 'jazz', gender: 'male', age: 24 }; const personUnknowAge = Object.keys(person).filter((key) => { return key !== 'age'; }) .map((key) => { return { [key]: person[key] } }) .reduce((acc, cur) => { return {...acc, ...cur}; }, {}); console.log(personUnknowAge); // {name: "jazz", gender: "male"}
更简洁的方案,利用ES6中函数参数解构:
const personUnknowAge = (({name, gender}) => ({name, gender}))(person); console.log(personUnknowAge); // {name: "jazz", gender: "male"}
固然还有更简单的方案,利用ES6中对象解构:
const person = { name: 'jazz', gender: 'male', age: 24 }; let { age, ...personUnknowAge } = person; console.log(personUnknowAge); // {name: "jazz", gender: "male"}
数组操做的“妙用”远不止这些,后面有空再研究补充吧,完~