先来了解下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"}