js的数组的一些操作

Posted swallowblank

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了js的数组的一些操作相关的知识,希望对你有一定的参考价值。

1 arr.reduce

let xxx = arr.reduce( function (pv, cv, ci ,arr) {
     return 
}[, init_val] )

对arr的每个元素,执行匿名函数fun,并将返回值作为下一次调用fun的pv。
pv:pre value,上一次执行后返回的值。
cv:current value,当前操作对应的索引对应的值。
ci:current index,当前操作对应的索引。
arr:执行当前操作的数组。

当没有init_val的时候,跳过arr[0],默认从index=1开始执行,arr[0]直接充当pv。

当有init_val的时候,从index=0开始执行,init_val充当pv。

let arr = [1,2,3,4]

let = sum = arr.reduce(function (pr, cv, ci, arr) {
    console.log(pr, cv, ci);
    return pr + cv;
})

console.log(sum);

直接从2开始的,1直接作pr

let arr = [1,2,3,4]

let = sum = arr.reduce(function (pr, cv, ci, arr) {
    console.log(pr, cv, ci);
    return pr + cv;
}, 0)

console.log(sum);

从1开始,0作pr,符合前缀和的逻辑
let arr = [1,2,3,4]

let = sum = arr.reduce(function (pr, cv, ci, arr) {
    console.log(pr, cv, ci);
    return pr + cv;
}, 5)

console.log(sum);

从1开始,相当于初值为5的前缀和

 不知道有什么用,反正没有原生的快就完事了。

 

2 arr.forEach

看完reduce就不得不顺便看一下forEach了

arr.forEach( function (cv, ci, arr) {

}[, thisvalue] )

这个thisvalue参数,我至今不知道可以怎么用。

各个参数含义和reduce一样,其中cv是必须的。

其实就是循环。

 

3 arr.map

那也就比逊顺便说一下map了

let new_arr = arr.map(function (cv, ci, arr) {
    return ;
})

返回值是一个新数组,新数组中的每个值等于对应旧数组当时在匿名函数里的返回值

例如,返回一个数组,是每个值的平方

  let arr = [1,2,3,4]

let new_arr = arr.map(function (cv, ci, arr) { return cv * cv; }) console.log(new_arr);

 

总结一下:

reduce 和 map都需要返回值,reduce返回的是一个值,而其每次的返回值,作为下一次运算的参数pv。

而map返回的是一个数组,新数组的每个值等于匿名函数的return值。

forEach的匿名函数不需要返回值,就是一个简单的循环,不产生新的东西。

但是不能这么写

let arr = [1,2,3,4]
arr.forEach(function (cv, ci, arr) {
    cv = cv * cv;
})
console.log(arr);

这个cv只是一个形参,arr的值不会变的。

必须写成

arr[ci] = cv * cv;

 

4 arr.filter()

这也是一个比较好用的api,字面意思,用于过滤一些元素

let new_arr = arr.filter(function (cv, vi ,arr) {
    return true or false;
})

true保留,false删掉。

 

5 arr.sort()

注*:不能对数字数组直接排序,因为会先化为字符串。用法和c艹的cmp一样,给sort传入一个cmp函数,注意顺序是反的,< 返回true是从大到小。

function cmp (x, y) {
    return x > y ? true : false;
}
console.log([10, 20, 1, 2].sort());
console.log([10, 20, 1, 2].sort(cmp));
  

 

6.数组去重并排序

1 let arr = [1,2,3,3,5,6,7,5,3,8,9,23,22,7,23,1];
2 // let arr = [\'apple\', \'strawberry\', \'banana\', \'pear\', \'apple\', \'orange\', \'orange\', \'strawberry\'];
3 
4 let new_arr = (arr.filter(function (cv, ci, arr) {
5     return arr.indexOf(cv) === ci;
6 })).sort((a, b) => {return a > b});
7 
8 console.log(new_arr);

 

7.Array.find() 和 findIndex()

arr.find((value, index, arr) => {
  return value > 4;
})

arr.findIndex((value, index, arr) => {
  return value > 4;
})

find 返回值

findIndex 返回下标

我觉得是不是利用自身的迭代器是不是比for + break快

以上是关于js的数组的一些操作的主要内容,如果未能解决你的问题,请参考以下文章

为什么我不能在此片段中生成唯一对象数组?

js简洁代码片段

js数组高阶方法reduce经典用法代码分享

js数组高阶方法reduce经典用法代码分享

JS常用代码片段-127个常用罗列-值得收藏

web代码片段