先来了解下reduce用法
arr.reduce(callback[, initialValue])
callback
执行数组中每个值的函数,包含四个参数:
accumulator
累计器累计回调的返回值; 它是上一次调用回调时返回的累积值,或initialValue
(见于下方)。currentValue
数组中正在处理的元素。currentIndex
可选 数组中正在处理的当前元素的索引。array
可选 调用reduce()
的数组initialValue
可选- 作为第一次调用
callback函数时
的第一个参数的值。 如果没有提供初始值,则将使用数组中的第一个元素。
注:
回调函数第一次执行时,accumulator
和currentValue
的取值有两种情况:
如果调用reduce()
时提供了initialValue
,accumulator
取值为initialValue
,currentValue
取数组中的第一个值;
如果没有提供initialValue
,那么accumulator
取数组中的第一个值,currentValue
取数组中的第二个值。
// js原生 + 三元运算符 function countOccurrences(arr,target) { var num = arr.reduce(function (acc,cur) { return cur === target ? acc + 1 : acc + 0 },0); return num } console.log(countOccurrences([1,2,2,1,2,3],2))
// 箭头函数 + 三元运算符 const countOccurrences1 = (arr, target) => arr.reduce((acc, cur) => cur === target ? acc + 1 : acc + 0, 0); console.log(countOccurrences1([1,2,2,1,2,3],2))
prop in object
如果指定的属性在指定的对象或其原型链中,则in 运算符返回true。
参数prop是指属性名或者数组索引
// 数组
var trees = new Array("redwood", "bay", "cedar", "oak", "maple");
1 in trees // 返回true
3 in trees // 返回true
6 in trees // 返回false
"bay" in trees // 返回false (必须使用索引号,而不是数组元素的值)
Symbol.iterator in trees // 返回true (数组可迭代,只在ES2015+上有效)
// 内置对象
"PI" in Math // 返回true
// 自定义对象
var mycar = {make: "Honda", model: "Accord", year: 1998};
"make" in mycar // 返回true
var arr = [1,2,3,2,4,2] let countOccurrences = arr.reduce(function (acc, cur){ if (cur in acc) { acc[cur]++; } else { acc[cur] = 1; } return acc; },{}); console.log(countOccurrences); // {1: 1, 2: 3, 3: 1, 4: 1}
正则表达式
console.log('http://url.com/page?name=Adam&surname=Smith'.match(/([^?=&]+)(=([^&]*))/g)) // ["name=Adam", "surname=Smith"] const getUrlParameters = url => url.match(/([^?=&]+)(=([^&]*))/g).reduce( (a, v) => (a[v.slice(0, v.indexOf('='))] = v.slice(v.indexOf('=') + 1), a), {} ) console.log(getUrlParameters('http://url.com/page?name=Adam&surname=Smith')) //{name: "Adam", surname: "Smith"}