JS数组方法

261 阅读9分钟

JS数组方法

一、创建数组方法

1、使用数组字面量创建

var arr = [] 
var arr = [ 20 ]  
var arr = [ "a", "b" ] 

2、Array构造函数

无参构造

   var arr = new Array()   //创建一个空数组

有参构造

   var arr = new Array(20)   //创建一个20项的空数组
   var arr = new Array( "a", "b", "c" )   //创建指定项的数组

3、Array.of (ES6新增)

Array.of()方法总会创建一个包含所有传入参数的数组,而不管参数的数量与类型。

let arr = Array.of(3)   //[ 3 ]  
console.log(arr.length)    //1  
console.log(arr[0])      //3  
let arr1 = Array.of("aa", "bb", "cc")    //['aa','bb','cc']  

4、Array.from (ES6新增)

在 js 中将非数组对象转换为真正的数组是非常麻烦的。在 ES6 中,将可迭代对象或者类数组对象作为第一个参数传入,Array.from()就能返回一个数组。

function arga(...args) {  //...args剩余参数数组,由传递给函数的实际参数提供    
let arg = Array.from(args);    
console.log(arg);
}
arga( arr1 , 26,  from ); // [ arr1 ,26, from ]  

二、检测数组方法

1、instanceof

let arr = []
let obh={}
consolog.log(arr instanceof Array)  //true
consolog.log(obj instanceof Array)  //false  

2、Array.isArray(ES6新增)

let arr = []
let obh={}
consolog.log(Array.isArray(arr))  //true
consolog.log(Array.isArray(obj))  //false  

三、数组循环方法

1、for循环

let arr=[1,2,3,4,5,6,7]
for(let i=0; i<arr.length; i++){
  return arr[i]   //返回数组的每一项
}

2、map循环 有返回值

  let arr=[1,2,3,4,5,6,7]
  arr.map((item,index)=>{
     return [item,index]  //返回每一项和对应的下标
  })
  let arr1= arr.map((item,index)=>{
     return item+1
  })
  console.log(arr1) //[2,3,4,5,6,7,8] //返回一个新数组

3、forEach循环 无返回值

  let arr=[1,2,3,4,5,6,7]
  let arr1 = []
  arr.forEach((item,index)=>{
  arr1.push(item)  //不需要return
 })  

四、数组方法

1、join 数组转字符串

let arr = [1,2,3]
let arr1 = arr.join()   //123
let arr2 = arr.join(",")  //1,2,3  传入想转换的符号

2、push 和 pop 原数组改变

  • push 向数组末尾添加元素可以添加一个或多个

  • pop 删除数组的最后一个,并返回删除的元素

      var arr = ["Lily","lucy","Tom"];
      var count = arr.push("Jack","Sean");
      console.log(count);  // 5
      console.log(arr);   // ["Lily", "lucy","Tom","Jack","Sean"]
      var item = arr.pop();
      console.log(item);   // Sean
      console.log(arr);   // ["Lily", "lucy", "Tom", "Jack"]  
    

3、shift 和 unshift 原数组改变

  • shift 删除数组的第一项,返回删除的元素

  • unshift 向数组的开头添加一个或多个,返回数组的长度

      var arr = ["Lily","lucy","Tom"];
      var count = arr.unshift("Jack","Sean");
      console.log(count);  // 5
      console.log(arr);   //["Jack","Sean","Lily","lucy","Tom","Jack","Sean"]
      var item = arr.shift();
      console.log(item);   // Jack
      console.log(arr);   // ["Sean","Lily", "lucy", "Tom", "Jack"]  
    

4、sort

  • 对数组排序

  • 排序顺序可以是字母或数组,按升序或降序

  • 默认方式按字母

      var arr1 = ["a", "d", "c", "b"];
      console.log(arr1.sort());   // ["a", "b", "c", "d"]
      arr2 = [13, 24, 51, 3];
      console.log(arr2.sort());   // [13, 24, 3, 51]
      console.log(arr2);   // [13, 24, 3, 51](元数组被改变)  
    
    • 为了解决上述问题,sort()方法可以接收一个比较函数作为参数,以便我们指定哪个值位于哪个值的前面。比较函数接收两个参数,如果第一个参数应该位于第二个之前则返回一个负数,如果两个参数相等则返回 0,如果第一个参数应该位于第二个之后则返回一个正数。以下就是一个简单的比较函数:

         function compare(value1, value2) {    
           if (value1 < value2) {    
             return -1;    
           } else if (value1 > value2) {     
             return 1;    
           } else {     
             return 0;    
           }
         }
         arr2 = [13, 24, 51, 3];
         console.log(arr2.sort(compare));   // [3, 13, 24, 51]  
      
    • 如果需要通过比较函数产生降序排序的结果,只要交换比较函数返回的值即可:

        function compare(value1, value2) {    
          if (value1 < value2) {     
            return 1;    
          } else if (value1 > value2) {     
            return -1;    
          } else {     
            return 0;   
          } 
        }
        arr2 = [13, 24, 51, 3];
        console.log(arr2.sort(compare));   // [51, 24, 13, 3]  
      

5、reverse 数组颠倒,反转

var arr = [13, 24, 51, 3];
console.log(arr.reverse());  //[3, 51, 24, 13]
console.log(arr);   //[3, 51, 24, 13](原数组改变)

6、concat 连接两个或多个数组 原数组改变

var arr = [1,3,5,7];
var arrCopy = arr.concat(9,[11,13]);
console.log(arrCopy);   //[1, 3, 5, 7, 9, 11, 13]
console.log(arr);   // [1, 3, 5, 7](原数组未被修改)

7、slice 截取数组 返回从开始下标到结束下标的数组(包头不包尾 下标)不改变原数组

  • 一个参数时,返回从这个参数指定位置开始到当前数组的结尾
  • 两个参数时,返回起始位置和结束位置的项组成的数组,不包含结束位置,如果为负数参数,则让这个负数加上当前数组的长度来代替当前这个参数
var arr = [1,3,5,7,9,11];
var arrCopy = arr.slice(1);
var arrCopy2 = arr.slice(1,4);
var arrCopy3 = arr.slice(1,-2);//相当于arr.slice(1,4)
var arrCopy4 = arr.slice(-4,-1);//相当于arr.slice(2,5)
console.log(arr);   //[1, 3, 5, 7, 9, 11](原数组没变)
console.log(arrCopy);   //[3, 5, 7, 9, 11]
console.log(arrCopy2);   //[3, 5, 7]
console.log(arrCopy3);   //[3, 5, 7]
console.log(arrCopy4);   //[5, 7, 9]

8、splice 可以删除、替换、添加 会改变原数组

  • 删除时,参数为删除项的下标和删除的项数两个参数,返回的是删除的元素所组成的数组
var arr = [1,3,5,7,9,11];
var arrRemoved = arr.splice(0,2);
console.log(arr);   //[5, 7, 9, 11]
console.log(arrRemoved);   //[1, 3]
  • 添加时,参数为添加的下标,0,所添加的元素,返回的是原数组和添加的项组成的新数组
var array1 = [22, 3, 31, 12];
array1.splice(1, 0, 12, 35);  //[]
console.log(array1); // [22, 12, 35, 3, 31, 12]
  • 替换时,参数为替换的下标,删除的项数,想添加任意数量的项
const array1 = [22, 3, 31, 12];
array1.splice(1, 1, 8);   //[3]
console.log(array1);  // [22, 8, 31, 12]

9、indexOf 和 lastIndexOf indexOf从前往后找,lastIndexOf从后往前找

  • 一个参数时,则是要查找的项,找到了返回下标,找不到返回-1
var arr = [1,3,5,7,7,5,3,1];
console.log(arr.indexOf(5));   //2
console.log(arr.lastIndexOf(5));   //5
  • 两个参数时,则从第二个参数为起始位置开始找到存在项的下标,从后往前数没有返回-1;indexOf第二个参数为负数时,传入几,就从后往前数几个数,在这些元素中去查找传入的元素,有的话则返回在数组中的下标,不存在返回-1
var arr = [1,3,5,7,7,5,3,1];
console.log(arr.indexOf(5,2));   //2 即从开头下标2的位置为起始位置开始找5
console.log(arr.lastIndexOf(5,4));   //2 即从末尾开始,找到下标2为起始位置,继续找5
console.log(arr.indexOf("5"));   //-1
console.log(numbers.indexOf(3,-4)) //6 
//从后往前数的4个数中,(即在7,5,3,1中查询数字3,从前往后数),则存在数字3,且在数组中的位置为6 则返回6
console.log(numbers.indexOf(5,-6)) // 2 
//从后往前数的6个数中,(即在5,7,7,5,3,1中查询数字5 从前往后数),则存在数字5的第一个位置且在数组中的位置为2 则返回2

10、forEach 遍历数组,没有返回值,不会改变原数组,对数组中的每一项运行给定函数。函数参数为每一项,下标索引,数组本身

var arr = [11, 22, 33, 44, 55];
arr.forEach(function(x, index, a){ 
console.log(x +  |  + index +  |  + (a === arr));
}
);
输出为:
 11|0|true 
 22|1|true 
 33|2|true 
 44|3|true 
 55|4|true

11、map 返回一个新数组,数组中的元素为原始数组元素调用函数处理后的值,有返回值。不会改变原数组

var arr = [1, 2, 3, 4, 5];
var arr2 = arr.map(function(item){ 
return item*item;
}
);
console.log(arr2);  //[1, 4, 9, 16, 25]

12、“过滤”功能,数组中的每一项运行给定函数,返回满足过滤条件组成的数组。不改变原数组

var arr = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10];
var arr2 = arr.filter(function(x, index) { 
return index % 3 === 0 || x >= 8;}
);console.log(arr2);  //[1, 4, 7, 8, 9, 10]

13、fill es6新增 能使用特定值填充数组中的一个或多个元素。改变原数组

  • 一个参数时,该方法会用该参数的值填充整个数组。
let arr = [1, 2, 3,  'cc' , 5];
arr.fill(1);
console.log(arr);//[1,1,1,1,1];
  • 不想改变数组中的所有元素,可以传入两个或三个参数,参数为:填充数值,起始位置参数,结束位置参数(不包括结束位置的那个元素)
let arr = [1, 2, 3,  'cc' , 5];
arr.fill(1, 2);
console.log(arr);//[1,2,1,1,1]
arr.fill(0, 1, 3);
console.log(arr);//[1,0,0,1,1];

14、every 判断数组中每一项都是否满足条件,只有所有项都满足条件,才会返回 true。

var arr = [1, 2, 3, 4, 5];
var arr2 = arr.every(x => x < 10);
console.log(arr2);  //true
var arr3 = arr.every(x => return x < 3);
console.log(arr3);  // false

15、some 判断数组中是否存在满足条件的项,只要有一项满足条件,就会返回 true。

var arr = [1, 2, 3, 4, 5];
var arr2 = arr.some(x => x < 3);
console.log(arr2);  //true
var arr3 = arr.some(x => x < 1);
console.log(arr3);  // false

16、includes 判断数组中是否存在指定的值,存在返回true,否则返回false。参数为查找的值、开始查找的下标,第一个必填,第二个参数选填。

const array1 = [22, 3, 31, 12,  arr ];
const includes = array1.includes(31);
console.log(includes); // true
const includes1 = array1.includes(31, 3); // 从索引3开始查找31是否存在
console.log(includes1); // false

includes使用===运算符来进行值比较,仅有一个例外:NaN 被认为与自身相等。

let values = [1, NaN, 2];right
console.log(values.indexOf(NaN));//-1
console.log(values.includes(NaN));//true

17、reduce 和 reduceRight 都会实现迭代数组的所有项(即累加器),然后构建一个最终返回的值。

  • reduce从第一个开始遍历到最后一个
  • reduceRight从最后一个开始遍历到第一个
  • 4个参数:前一项,当前项,下标,数组本身
var values = [1,2,3,4,5];
var sum = values.reduceRight(function(prev, cur, index, array){
return prev + cur
},10);   //数组一开始加了一个初始值10,可以不设默认0
console.log(sum);  //25

18、toLocaleString 和 toString 将数组转换为字符串

const array1 = [22, 3, 31, 12];
const str = array1.toLocaleString();
const str1 = array1.toString();
console.log(str); // 22,3,31,12
console.log(str1); // 22,3,31,12

19、find 和 findIndex

  • find 查找符合第一个条件的项,找到了就返回当前项
  • findIndex 查找第一个符合条件的索引,找到了则返回符合项的下标
let arr = [1, 2, 3,  arr , 5, 1, 9];
console.log(arr.find((item, index, arr) => {   
return value > 2
})); // 3 返回匹配的值
console.log(arr.findIndex((value, index, arr) => {   
return value > 2
})) // 2 返回匹配位置的索引

20、copyWithin()(es6 新增)用于从数组的指定位置拷贝元素到数组的另一个指定位置中。会改变原有数组。

//将数组的前两个元素复制到数组的最后两个位置
let arr = [1, 2, 3,  arr , 5];
arr.copyWithin(3, 0);
console.log(arr);//[1,2,3,1,2]

copyWithin()方法总是会一直复制到数组末尾,不过你还可以提供一个可选参数来限制到底有多少元素会被覆盖。这第三个参数指定了复制停止的位置(不包含停止的位置)。

let arr = [1, 2, 3,  arr , 5, 9, 17];
//从索引3的位置开始粘贴 即从arr开始
//从索引0的位置开始复制 即1,2 ,3
//遇到索引3时停止复制 17时停止不包含17本身
arr.copyWithin(3, 0, 3);
console.log(arr);//[1,2,3,1,2,3,17]

21、flat() 和 flatMap() (es6 新增)

  • flat数组扁平化处理默认值为1,传入几则扁平化基层
const arr1 = [0, 1, 2, [3, 4]];
console.log(arr1.flat());// expected output: [0, 1, 2, 3, 4]
const arr2 = [0, 1, 2, [[[3, 4]]]];
console.log(arr2.flat(2));// expected output: [0, 1, 2, [3, 4]]
//使用 Infinity,可展开任意深度的嵌套数组
var arr4 = [1, 2, [3, 4, [5, 6, [7, 8, [9, 10]]]]];
arr4.flat(Infinity);// [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
// 扁平化数组空项,如果原数组有空位,flat()方法会跳过空位
var arr4 = [1, 2, , 4, 5];
arr4.flat();// [1, 2, 4, 5]
  • flatMap 对原数组的每个成员执行一个函数,相当于执行Array.prototype.map(),然后对返回值组成的数组执行flat()方法。
// 相当于 [[2, 4], [3, 6], [4, 8]].flat()
[2, 3, 4].flatMap((x) => [x, x * 2])
// [2, 4, 3, 6, 4, 8]  

22、entries(),keys() 和 values() (ES6)遍历数组

  • entries对键值对的遍历,keys对键名的遍历,values对键值的遍历

     //对象
     let data = {aa:2,bb:4,cc:7}
     console.log(Object.keys(data)); //['aa', 'bb', 'cc']
     console.log(Object.values(data)); // [2, 4, 7]
     console.log(Object.entries(data)); //[['aa', 2],['bb', 4],['cc', 7]]
     //数组
     let data = [1,2,3,6]
     console.log(Object.keys(data)); //['0', '1', '2', '3']
     console.log(Object.values(data)); // [1, 2, 3, 6,]
     console.log(Object.entries(data)); //[['0', 1], ['1', 2], ['2', 3],['3', 6]]