Fork me on GitHub

JavaScript中Array数组方法总结

JavaScript 中 Array 数组方法总结

  1. JavaScript 中 String 字符串方法总结

  2. JavaScript 中 Array 数组方法总结

  3. JavaScript 中 Object 对象方法总结

方法 是否修改原始值 是否有返回值 描述
join() 把数组的所有元素放入一个字符串。原始值不变。
concat() 连接两个或更多的数组,并返回结果,返回新数组,原始值不变。
reverse() 反转数组的元素顺序。原始值改变
sort() 对数组的元素进行排序。原始值改变
pop() 删除数组的最后一个元素并返回删除的元素。原始值改变
push() 向数组的末尾添加一个或更多元素,并返回新的长度。原始值改变
shift() 删除并返回数组的第一个元素。原始值改变
unshift() 向数组的开头添加一个或更多元素,并返回新的长度。原始值改变
slice() 选取数组的一部分,并返回一个新数组。原始值不变。
splice() 从数组中添加或删除元素。原始值改变
forEach() 数组每个元素都执行一次回调函数。原始值不变。
every() 检测数值元素的每个元素是否都符合条件。布尔值。如果所有元素都通过检测返回 true,否则返回 false。原始值不变。
some() 检测数组元素中是否有元素符合指定条件。布尔值。如果数组中有元素满足条件返回 true,否则返回 false。原始值不变。
filter() 检测数值元素,并返回符合条件所有元素的数组。返回数组,包含了符合条件的所有元素。如果没有符合条件的元素则返回空数组。原始值不变。
map() 通过指定函数处理数组的每个元素,并返回处理后的数组。返回新数组,原始值不变。
indexOf() 搜索数组中的元素,并返回它所在的位置。从左向右查找,元素在数组中的位置,如果没有搜索到则返回 -1。原始值不变。
lastIndexOf() 搜索数组中的元素,并返回它最后出现的位置。从右向左查找,元素在数组中的位置,如果没有搜索到则返回 -1。原始值不变。
includes() 判断一个数组是否包含一个指定的值。布尔值。如果找到指定值返回 true,否则返回 false。原始值不变。
copyWithin() 从数组的指定位置拷贝元素到数组的另一个指定位置中。原始值改变
from() 将两类对象转为真正的数组:类似数组的对象(array-like object)和可遍历(iterable)的对象(包括 ES6 新增的数据结构 Set 和 Map)。返回数组对象。原始值不变。
fill() 使用一个固定值来填充数组。并返回一个新数组。原始值改变
find() 返回符合传入测试(函数)条件的数组元素。当数组中的元素在测试条件时返回 true 时, find() 返回符合条件的元素,之后的值不会再调用执行函数。如果没有符合条件的元素返回 undefined。原始值不变。
findIndex() 返回符合传入测试(函数)条件的数组元素索引。当数组中的元素在测试条件时返回 true 时, findIndex() 返回符合条件的元素的索引位置,之后的值不会再调用执行函数。如果没有符合条件的元素返回 -1,原始值不变。
isArray() 判断对象是否为数组。如果对象是数组返回 true,否则返回 false。布尔值。原始值不变。
keys() 包含原始数组的键名(key), 键名的遍历器对象,可以用 for...of 循环进行遍历。
values() 包含原始数组的键值(value), 键值的遍历器对象,可以用 for...of 循环进行遍历。
entries() 包含原始数组的键名(key)、键值(value),键值对的遍历器对象,可以用 for...of 循环进行遍历。
of() 总是将一组值,转换为数组。
flat() 用于将嵌套的数组“拉平”,变成一维的数组。该方法返回一个新数组,对原数据没有影响。
flatMap() 总对原数组的每个成员执行一个函数,然后对返回值组成的数组执行 flat()方法。该方法返回一个新数组,不改变原数组。只能展开一层数组。
at() 接受一个整数作为参数,返回对应位置的成员,支持负索引。这个方法不仅可用于数组,也可用于字符串和类型数组(TypedArray)。
reduce() 对数组里每个元素执行一次回调函数,将数组元素计算为一个值(从左到右)。
reduceRight() 对数组里每个元素执行一次回调函数,将数组元素计算为一个值(从右到左)。
toString() 把数组转换为字符串,并返回结果。
valueOf() 返回数组对象的原始值。

跳出循环/结束遍历方法

方法 break continue return return true return false 结论
for 循环 成功 跳出本次循环 不合法 不合法 不合法
Array.forEach() 不合法 不合法 跳出本次循环 跳出本次循环 跳出本次循环 ×
for...in 成功 跳出本次循环 不合法 不合法 不合法
Array.map() 不合法 不合法 跳出本次循环 跳出本次循环 跳出本次循环 ×
Array.some() 不合法 不合法 跳出本次循环 成功 跳出本次循环
Array.every() 不合法 不合法 成功 跳出本次循环 成功
Array.find() 不合法 不合法 跳出本次循环 成功 跳出本次循环
Array.findIndex() 不合法 不合法 跳出本次循环 成功 跳出本次循环

方法解析

代码没有特殊标注情况下,本文环境均是在 Chrome 环境下测试输出

array.join() : 把数组的所有元素放入一个字符串。原始值不变。

  1. 默认值是 ,


        let arr1 = [1,2,3,4,5,6,7,8,9];

        // 1,2,3,4,5,6,7,8,9  [1, 2, 3, 4, 5, 6, 7, 8, 9]
        console.log( arr1.join(), arr1);

        // 1-2-3-4-5-6-7-8-9  [1, 2, 3, 4, 5, 6, 7, 8, 9]
        console.log( arr1.join('-'), arr1);


array.concat() : 连接两个或更多的数组,并返回结果,返回新数组,原始值不变。

  1. 可以放数组,字符串任何东西

        let str1 = 'hello';
        let obj1 = { age: 19};
        let arr1 = [1,2,3];
        let arr2 = [4,5];

        // [1, 2, 3, 'hello', {…}, 4, 5]
        console.log( arr1.concat( str1, obj1 ,arr2 ) );

        // [1, 2, 3]
        console.log( arr1 );


array.reverse() : 反转数组的元素顺序。原始值改变


        let arr1 = [1,2,3,4,5,6,7,8,9];

        // [9, 8, 7, 6, 5, 4, 3, 2, 1]  [9, 8, 7, 6, 5, 4, 3, 2, 1]
        console.log( arr1.reverse(), arr1);



array.sort( [排序规则] ) : 对数组的元素进行排序。原始值改变

条件:
1,规则必须是一个函数。
2,函数必须有返回值。
3,返回值必须是 number 类型的数字。
排序方式: 每次挑选两个值进行排序,直到把所有的位置关系都确定下。
1,如果返回值是一个正数,就会交换两个比较值的位置。
2,如果返回值是负数或者零,就不会交换两个比较值的位置。(0 表示两个比较值是相等的。)
注意: 自定义规则必须返回一个 number 类型的数字,否则规则无效,不会排序。


        let arr1 = [11,12,13,14,135,16,17,18,19];

        // [9, 8, 7, 6, 5, 4, 3, 2, 1]  [9, 8, 7, 6, 5, 4, 3, 2, 1]
        console.log( arr1.sort(), arr1);

        //  [11, 12, 13, 14, 16, 17, 18, 19, 135]  [11, 12, 13, 14, 16, 17, 18, 19, 135]
        console.log( arr1.sort( ( n1, n2)=>{ return n1-n2 } ), arr1);

        // [135, 19, 18, 17, 16, 14, 13, 12, 11]  [135, 19, 18, 17, 16, 14, 13, 12, 11]
        console.log( arr1.sort( ( n1, n2)=>{ return n2-n1 } ), arr1);



array.pop() : 删除数组的最后一个元素并返回删除的元素。原始值改变


        let arr1 = [1,2,3,4,5];

        // 5
        console.log( arr1.pop() );

        // [1, 2, 3, 4]
        console.log( arr1 );

array.push() : 向数组的末尾添加一个或更多元素,并返回新的长度。原始值改变


        let arr1 = [1,2,3,4,5];

        // 6
        console.log( arr1.push(6) );

        // [1, 2, 3, 4, 5, 6]
        console.log( arr1 );

        // 8
        console.log( arr1.push(6,7) );

        // [1, 2, 3, 4, 5, 6, 6, 7]
        console.log( arr1 );

        // 9
        console.log( arr1.push([6,7]) );

        // [1, 2, 3, 4, 5, 6, 6, 7, [6,7]]
        console.log( arr1 );

array.shift() : 删除并返回数组的第一个元素。原始值改变



        let arr1 = [1,2,3,4,5];

        // 1
        console.log( arr1.shift() );

        // [2, 3, 4, 5]
        console.log( arr1 );

array.unshift() : 向数组的开头添加一个或更多元素,并返回新的长度。原始值改变


        let arr1 = [1,2,3,4,5];

        // 6
        console.log( arr1.unshift(6) );

        // [6, 1, 2, 3, 4, 5]
        console.log( arr1 );

        // 8
        console.log( arr1.unshift(6,7) );

        // [6, 6, 7, 1, 2, 3, 4, 5]
        console.log( arr1 );

        // 9
        console.log( arr1.unshift([6,7]) );

        // [[6,7], 6, 7, 6, 1, 2, 3, 4, 5]
        console.log( arr1 );



array.slice( start, end ) : 选取数组的一部分,并返回一个新数组。原始值不变。

  1. start : 必需。规定从何处开始选取。如果是负数,那么它规定从数组尾部开始算起的位置。也就是说,-1 指最后一个元素,-2 指倒数第二个元素,以此类推。
  2. end : 可选。规定从何处结束选取。该参数是数组片断结束处的数组下标。如果没有指定该参数,那么切分的数组包含从 start 到数组结束的所有元素。如果这个参数是负数,那么它规定的是从数组尾部开始算起的元素。
  3. 不包含 end 元素,原数组不变,返回的是新数组,如果传负数,则用数组长度加上该数来确定相应的位置
  4. 如果 end 结束位置小于 start 起始位置,则返回空数组



        let arr1 = [1,2,3,4,5];

        // [1, 2, 3, 4, 5]
        console.log( arr1.slice() );

        // [3, 4, 5]
        console.log( arr1.slice( 2 ) );

        // [5]
        console.log( arr1.slice( -1 ) );

        // []
        console.log( arr1.slice( 3, 1 ) );

        // []
        console.log( arr1.slice( -1, -3 ) );

        // [3]
        console.log( arr1.slice( -3, -2 ) );

        // []
        console.log( arr1.slice( -30, 0 ) );

array.splice( index, howmany, item1, ....., itemX ) : 从数组中添加或删除元素。原始值改变

  1. 如果仅删除元素,则返回删除元素的数组。 如果未删除任何元素,则返回空数组。
  2. index : 必需。规定从何处添加/删除元素。该参数是开始插入和(或)删除的数组元素的下标,必须是数字。
  3. howmany : 可选。规定应该删除多少元素。必须是数字,但可以是 "0"。如果未规定此参数,则删除从 index 开始到原数组结尾的所有元素。
  4. item1, ..., itemX : 可选。要添加到数组的新元素


        let arr1 = [1,2,3,4,5,6,7,8,9];

        // []  [1, 2, 3, 4, 5, 6, 7, 8, 9]
        console.log( arr1.splice(), arr1);

        // [3, 4, 5, 6, 7, 8, 9]   [1, 2]
        console.log( arr1.splice( 2 ), arr1 );

        let arr2 = [1,2,3,4,5,6,7,8,9];

        //   [7, 8, 9]   [1, 2, 3, 4, 5, 6]
        console.log( arr2.splice( -3 ), arr2 );

        let arr3 = [1,2,3,4,5,6,7,8,9];

        //  [4, 5, 6]   [1, 2, 3, 7, 8, 9]
        console.log( arr3.splice( 3, 3 ), arr3 );

array.forEach( fn ) : 数组每个元素都执行一次回调函数。原始值不变。

  1. 不会对空数组进行检测。
  2. fn( item, index, arr) : fn 必须。函数,数组中的每个元素都会执行这个函数, item 必须。当前元素的值, index 可选。当前元素的索引值, arr 可选。当前元素属于的数组对象
  3. 基本类型我们当次循环拿到的 ele,只是 forEach 给我们在另一个地方复制创建新元素,是和原数组这个元素没有半毛钱联系的!所以,我们使用 forEach 循环拿到的 ele 赋值都是无用功!如果 fn 里面的 item 是对象,可就不是这种情况了,是会修改原始值的!!!
  4. 针对每一个元素执行提供的函数(executes a provided function once for each array element)。除了抛出异常以外,没有办法中止或跳出 forEach() 循环。如果你需要中止或跳出循环,forEach() 方法不是应当使用的工具。

forEach() 被调用时,不会改变原数组,也就是调用它的数组(尽管 callback 函数在被调用时可能会改变原数组)。(译注:此处说法可能不够明确,具体可参考 EMCA 语言规范:‘forEach does not directly mutate the object on which it is called but the object may be mutated by the calls to callbackfn.’,即 forEach 不会直接改变调用它的对象,但是那个对象可能会被 callback 函数改变。)


        let sum = 0;
        let arr1 = [11,12,13,14,135,16,17,18,19];

        arr1.forEach( ( item) => { sum += item; } );

        // 255
        console.log(sum);

array.every( fn ) : 检测数值元素的每个元素是否都符合条件。布尔值。如果所有元素都通过检测返回 true,否则返回 false。原始值不变。

  1. 不会对空数组进行检测。
  2. 如果数组中检测到有一个元素不满足,则整个表达式返回 false ,且剩余的元素不会再进行检测。如果所有元素都满足条件,则返回 true。
  3. fn( item, index, arr) : fn 必须。函数,数组中的每个元素都会执行这个函数, item 必须。当前元素的值, index 可选。当前元素的索引值, arr 可选。当前元素属于的数组对象

        let arr1 = [11,12,13,14,135,16,17,18,19];

        // true  [11, 12, 13, 14, 135, 16, 17, 18, 19]
        console.log( arr1.every( ( item, index, arr )=>{ return item >9 } ), arr1);

        // false  [11, 12, 13, 14, 135, 16, 17, 18, 19]
        console.log( arr1.every( ( item, index, arr )=>{ return item >150 } ), arr1);

        let arr2 =[];

        // true  []
        console.log( arr2.every( ( item, index, arr )=>{ return item >9 } ), arr2);

        // true  []
        console.log( arr2.every( ( item, index, arr )=>{ return item >150 } ), arr2);

array.some() : 检测数组元素中是否有元素符合指定条件。布尔值。如果数组中有元素满足条件返回 true,否则返回 false。原始值不变。

  1. 不会对空数组进行检测。
  2. 如果有一个元素满足条件,则表达式返回 true , 剩余的元素不会再执行检测。如果没有满足条件的元素,则返回 false。
  3. fn( item, index, arr) : fn 必须。函数,数组中的每个元素都会执行这个函数, item 必须。当前元素的值, index 可选。当前元素的索引值, arr 可选。当前元素属于的数组对象

        let arr1 = [11,12,13,14,135,16,17,18,19];

        // true, [11, 12, 13, 14, 135, 16, 17, 18, 19]
        console.log( arr1.some( ( item, index, arr )=>{ return item += 15 } ), arr1);

        // true, [11, 12, 13, 14, 135, 16, 17, 18, 19]
        console.log( arr1.some( ( item, index, arr )=>{ return item += 150 } ), arr1);

        let arr2 =[];

        // false, []
        console.log( arr2.some( ( item, index, arr )=>{ return item += 9 } ), arr2);

        // false, []
        console.log( arr2.some( ( item, index, arr )=>{ return item += 150 } ), arr2);



array.filter( fn ) : 检测数值元素,并返回符合条件所有元素的数组。返回数组,包含了符合条件的所有元素。如果没有符合条件的元素则返回空数组。原始值不变。

  1. 不会对空数组进行检测。
  2. 结果是执行 fn 函数会返回 true 的项组成的数组。
  3. fn( item, index, arr) : fn 必须。函数,数组中的每个元素都会执行这个函数, item 必须。当前元素的值, index 可选。当前元素的索引值, arr 可选。当前元素属于的数组对象

        let arr1 = [11,12,13,14,135,16,17,18,19];

        // [135, 16, 17, 18, 19] [11, 12, 13, 14, 135, 16, 17, 18, 19]
        console.log( arr1.filter( ( item, index, arr )=>{ return item > 15 } ), arr1);

        // [] [11, 12, 13, 14, 135, 16, 17, 18, 19]
        console.log( arr1.filter( ( item, index, arr )=>{ return item > 150 } ), arr1);

        let arr2 =[];

        // [] []
        console.log( arr2.filter( ( item, index, arr )=>{ return item > 9 } ), arr2);

        // [] []
        console.log( arr2.filter( ( item, index, arr )=>{ return item > 150 } ), arr2);

array.map() : 通过指定函数处理数组的每个元素,并返回处理后的数组。返回新数组,原始值不变。

  1. 不会对空数组进行检测。
  2. fn( item, index, arr) : fn 必须。函数,数组中的每个元素都会执行这个函数, item 必须。当前元素的值, index 可选。当前元素的索引值, arr 可选。当前元素属于的数组对象
  3. 创建一个新的数组,其中每一个元素由调用数组中的每一个元素执行提供的函数得来(creates a new array with the results of calling a provided function on every element in the calling array)。map 方法会给原数组中的每个元素都按顺序调用一次 callback 函数。callback 每次执行后的返回值(包括 undefined)组合起来形成一个新数组。 callback 函数只会在有值的索引上被调用;那些从来没被赋过值或者使用 delete 删除的索引则不会被调用。

        let arr1 = [11,12,13,14,135,16,17,18,19];

        // [26, 27, 28, 29, 150, 31, 32, 33, 34] [11, 12, 13, 14, 135, 16, 17, 18, 19]
        console.log( arr1.map( ( item, index, arr )=>{ return item += 15 } ), arr1);

        // [161, 162, 163, 164, 285, 166, 167, 168, 169]  [11, 12, 13, 14, 135, 16, 17, 18, 19]
        console.log( arr1.map( ( item, index, arr )=>{ return item += 150 } ), arr1);

        let arr2 =[];

        // [] []
        console.log( arr2.map( ( item, index, arr )=>{ return item += 9 } ), arr2);

        // [] []
        console.log( arr2.map( ( item, index, arr )=>{ return item += 150 } ), arr2);



array.indexOf( searchItem, fromIndex ) : 搜索数组中的元素,并返回它所在的位置。从左向右查找,元素在数组中的位置,如果没有搜索到则返回 -1。原始值不变。

  1. searchItem : 必须。查找的元素。
  2. fromIndex : 可选,表示从这个位置开始向右搜索,若缺省或格式不合要求,使用默认值 0

        let arr1 = [2, 5, 7, 3, 5];

        // 1 ("x"被忽略)
        console.log(arr1.indexOf(5, "x"));

        // 4 (从3号位开始向右搜索)
        console.log(arr1.indexOf(5, "3"));

        // -1 (未找到)
        console.log(arr1.indexOf(4));

        // -1 (未找到,因为5 !== "5")
        console.log(arr1.indexOf("5"));



array.lastIndexOf( searchItem, fromIndex ) : 从右向左查找,元素在数组中的位置,如果没有搜索到则返回 -1。原始值不变。

  1. searchItem : 必须。查找的元素。
  2. fromIndex : 可选,表示从这个位置开始向左搜索,若缺省或格式不合要求,使用默认值 array.length - 1


        let arr1 = [2, 5, 7, 3, 5];

        // -1 ("x"被忽略)
        console.log(arr1.lastIndexOf(5, "x"));

        // 1 (从倒数3号位开始向左搜索)
        console.log(arr1.lastIndexOf(5, "3"));

        // -1 (未找到)
        console.log(arr1.lastIndexOf(4));

        // -1 (未找到,因为5 !== "5")
        console.log(arr1.lastIndexOf("5"));

array.includes( searchItem, fromIndex ) : 判断一个数组是否包含一个指定的值。布尔值。如果找到指定值返回 true,否则返回 false。原始值不变。

  1. searchItem : 必须。查找的元素。
  2. fromIndex : 可选,表示从这个位置开始向右搜索,如果为负值,则按升序从 array.length + fromIndex 的索引开始搜索。默认为 0。
  3. 如果 fromIndex 大于等于数组长度 ,则返回 false 。该数组不会被搜索


        let arr1 = [2, 5, 7, 3, 5];
        let arr2 = [2, 5, 7, 3, NaN];

        // true
        console.log(arr1.includes( 7));

        // false
        console.log(arr1.includes( 4 ));

        // true
        console.log(arr1.includes( 3, 3 ));

        // false
        console.log(arr1.includes( 3, -1));

        // true
        console.log(arr2.includes( NaN ));

array.copyWithin( target, start, end ) : 从数组的指定位置拷贝元素到数组的另一个指定位置中。返回拷贝后的数组,原始值改变

  1. target : 必需。复制到指定目标索引位置。
  2. start : 可选。元素复制的起始位置。从该位置开始读取数据,默认为 0。如果为负值,表示倒数。
  3. end : 可选。停止复制的索引位置 (默认为 array.length)。如果为负值,表示倒数。
  4. 这三个参数都应该是数值,如果不是,会自动转为数值。
  5. 会连空位一起拷贝。


        let arr1 = [1, 2, 3, 4, , 5];
        //  [4, 空白, 5, 4, 空白, 5]  [4, 空白, 5, 4, 空白, 5]
        console.log(arr1.copyWithin(0, 3), arr1);

        let arr2 = [1, 2, 3, 4, 5];
        // [4, 2, 3, 4, 5] [4, 2, 3, 4, 5]
        console.log(arr2.copyWithin(0, 3, 4), arr2);

        let arr3 = [1, 2, 3, 4, 5];
        // [4, 2, 3, 4, 5] [4, 2, 3, 4, 5]
        console.log(arr3.copyWithin(0, -2, -1), arr3);

array.from( object, mapFunction, thisValue ) : 将两类对象转为真正的数组:类似数组的对象(array-like object)和可遍历(iterable)的对象(包括 ES6 新增的数据结构 Set 和 Map)。返回数组对象。原始值不变。

  1. object : 必需,要转换为数组的对象。
  2. mapFunction : 可选,数组中每个元素要调用的函数。
  3. thisValue : 可选,映射函数(mapFunction)中的 this 对象。



        let setObj = new Set(['a', 'b', 'c']);
        let arrObj = Array.from(setObj);

        // Set(3) {'a', 'b', 'c'} (3) ['a', 'b', 'c']
        console.log( setObj, arrObj);

        let arr1 = [1, 2, 3];
        let arr2 = Array.from(arr1, x => x * 10);

        //  [1, 2, 3]  [10, 20, 30]
        console.log(arr1, arr2);




array.fill( target, start, end) : 使用一个固定值来填充数组。并返回一个新数组。原始值改变

  1. target : 将要填充的内容
  2. start : 可选,填充的开始位置索引
  3. end : 可选,填充的结尾位置索引
        ['a', 'b', 'c'].fill(7)
        // [7, 7, 7]

        new Array(3).fill(7)
        // [7, 7, 7]

        let arr1 = [1, 2, 3, 4, 5];

        //   [1, 2, 'aa', 'aa', 5]  [1, 2, 'aa', 'aa', 5]
        console.log(arr1.fill('aa', 2, 4), arr1);


array.find( fn ) : 返回符合传入测试(函数)条件的数组元素。当数组中的元素在测试条件时返回 true 时, find() 返回符合条件的元素,之后的值不会再调用执行函数。如果没有符合条件的元素返回 undefined。原始值不变。

  1. 不会对空数组进行检测。
  2. 当数组中的元素在测试条件时返回 true 时, find() 返回符合条件的元素,之后的值不会再调用执行函数。如果没有符合条件的元素返回 undefined。
  3. fn( item, index, arr) : fn 必须。函数,数组中的每个元素都会执行这个函数, item 必须。当前元素的值, index 可选。当前元素的索引值, arr 可选。当前元素属于的数组对象

        let arr1 = [1, 2, 3, 4, 5];

        //  1  [1, 2, 3, 4, 5] 返回第一个小于3的元素
        console.log(arr1.find( (n) => n < 3 ), arr1);



array.findIndex() : 返回符合传入测试(函数)条件的数组元素索引。当数组中的元素在测试条件时返回 true 时, findIndex() 返回符合条件的元素的索引位置,之后的值不会再调用执行函数。如果没有符合条件的元素返回 -1,原始值不变。

  1. 不会对空数组进行检测。
  2. 当数组中的元素在测试条件时返回 true 时, findIndex() 返回符合条件的元素的索引位置,之后的值不会再调用执行函数。如果没有符合条件的元素返回 -1。
  3. fn( item, index, arr) : fn 必须。函数,数组中的每个元素都会执行这个函数, item 必须。当前元素的值, index 可选。当前元素的索引值, arr 可选。当前元素属于的数组对象

        let arr1 = [1, 2, 3, 4, 5];

        //  3  [1, 2, 3, 4, 5] 返回第一个大于3的元素索引
        console.log(arr1.findIndex( (n) => n > 3 ), arr1);

Array.isArray() : 判断对象是否为数组。如果对象是数组返回 true,否则返回 false。布尔值。原始值不变。


        let arr1 = [1, 2, 3, 4, 5];

        //  true  [1, 2, 3, 4, 5]
        console.log(Array.isArray( arr1 ), arr1);


array.keys() : 包含原始数组的键名(key), 键名的遍历器对象,可以用 for...of 循环进行遍历。

array.values() : 包含原始数组的键值(value), 键值的遍历器对象,可以用 for...of 循环进行遍历。

array.entries() : 包含原始数组的键名(key)、键值(value),键值对的遍历器对象,可以用 for...of 循环进行遍历。


        let arr = ['a', 'b', 'c'];
        console.log( arr.entries()); //Array Iterator {}
        console.log( arr.keys()); //Array Iterator {}
        console.log( arr.values()); //Array Iterator {}

        for (let index of ['a', 'b', 'c'].keys()) {
            console.log(index);
        }
        // 0
        // 1
        // 2

        for (let elem of ['a', 'b', 'c'].values()) {
            console.log(elem);
        }
        // 'a'
        // 'b'
        // 'c'

        for (let [index, elem] of ['a', 'b', 'c'].entries()) {
            console.log(index, elem);
        }
        // 0 "a"
        // 1 "b"
        // 2 "c"

Array.of() : 总是将一组值,转换为数组。


        console.log(Array.of()) // []
        console.log(Array.of(undefined)) // [undefined]
        console.log(Array.of(1)) // [1]
        console.log(Array.of(1, 2,'1',{name:'tom'})) // [1, 2, '1', {name: 'tom'}]);



array.flat(num) : 用于将嵌套的数组“拉平”,变成一维的数组。该方法返回一个新数组,对原数据没有影响。

num: 拉平数组嵌套的层数,默认值是 1,Infinity 代表无限拉平
原数组有空位,flat()方法会跳过空位

[1, [2, [3]]].flat(Infinity)
// [1, 2, 3]

[1, 2, , 4, 5].flat()
// [1, 2, 4, 5]


array.flatMap(fn, thisArg) : 总对原数组的每个成员执行一个函数,然后对返回值组成的数组执行 flat()方法。该方法返回一个新数组,不改变原数组。

只能展开一层数组。
fn(currentValue, index, array): 一个遍历函数,该函数可以接受三个参数,分别是当前数组成员、当前数组成员的位置(从零开始)、原数组。
thisArg:第二个参数,用来绑定 fn 遍历函数里面的 this。

// 相当于 [[2, 4], [3, 6], [4, 8]].flat()
[2, 3, 4].flatMap((x) => [x, x * 2])
// [2, 4, 3, 6, 4, 8]


// flatMap()只能展开一层数组。
// 相当于 [[[2]], [[4]], [[6]], [[8]]].flat()
[1, 2, 3, 4].flatMap(x => [[x * 2]])
// [[2], [4], [6], [8]]



array.at() : 接受一个整数作为参数,返回对应位置的成员,支持负索引。这个方法不仅可用于数组,也可用于字符串和类型数组(TypedArray)。

参数位置超出了数组范围,at()返回 undefined。

        let arr = [5, 12, 8, 130, 44];
        console.log(arr.at(1)); // 12
        console.log(arr.at(-1)); // 44
        console.log(arr.at(10)); // undefined
        console.log(arr.at(-10)); // undefined

array.reduce(function(previousValue, currentValue, currentIndex, arr), initialValue) : 对数组里每个元素执行一次回调函数。将数组元素计算为一个值(从左到右)。

  1. function : 必需。用于执行每个数组元素的函数。
  2. previousValue : 必需。初始值(initialValue), 或者上一次调用回调(function)返回的值。
  3. currentValue : 必需。数组中当前被处理的元素
  4. currentIndex : 可选。当前元素在数组中的索引
  5. arr : 可选。当前元素所属的数组对象。
  6. initialValue :可选。传递给函数的初始值
  7. reduce() 对于空数组是不会执行回调函数的。
  • 没有设置函数的初始迭代值
        let arr = [1, 2, 3, 4];
        let sum = arr.reduce(function(prev, cur, index, arr) {
            console.log('prev--', prev, 'cur--', cur, 'index--', index);
            return prev + cur;
        })
        console.log(arr, sum);

        // 打印结果:
        // prev-- 1 cur-- 2 index-- 1
        // prev-- 3 cur-- 3 index-- 2
        // prev-- 6 cur-- 4 index-- 3
        // (4) [1, 2, 3, 4] 10

这里可以看出,上面的例子没有设置 initialValue 的时候,会把回调函数 index 是从 1 开始的,第一次的 previousValue 的值是数组的第一个值。数组长度是 4,但是 reduce 函数循环 3 次。

  • 设置初始迭代值
        let arr = [1, 2, 3, 4];
        let sum = arr.reduce(function (prev, cur, index, arr) {
                console.log('prev--', prev, 'cur--', cur, 'index--', index);
                return prev + cur;
        },5);
        console.log(arr, sum);

        // 打印结果:
        // prev-- 5 cur-- 1 index-- 0
        // prev-- 6 cur-- 2 index-- 1
        // prev-- 8 cur-- 3 index-- 2
        // prev-- 11 cur-- 4 index-- 3
        // (4) [1, 2, 3, 4] 15

这里我们添加了一个初始的迭代值,也就是让 prev 从 5 开始计算,可以看到,这里迭代了 4 次,结果也加上了初始值。

  • 计算数组中每个元素出现的次数

        let arr = ['name','age','long','short','long','name','name']

        let arrResult = arr.reduce((pre,cur) =>{
            console.log(pre,cur)
            if(cur in pre){
                pre[cur]++
            }else{
                pre[cur] = 1
            }
            return pre
        },{})

        console.log(arrResult)//结果:{name: 3, age: 1, long: 2, short: 1}

        // 打印结果:
        // {} 'name'
        // {name: 1} 'age'
        // {name: 1, age: 1} 'long'
        // {name: 1, age: 1, long: 1} 'short'
        // {name: 1, age: 1, long: 1, short: 1} 'long'
        // {name: 1, age: 1, long: 2, short: 1} 'name'
        // {name: 2, age: 1, long: 2, short: 1} 'name'
        // {name: 3, age: 1, long: 2, short: 1}
  • 去除数组中重复的元素

        let arr = ['name','age','long','short','long','name','name']

        let arrResult = arr.reduce((pre,cur) =>{
        if(!pre.includes(cur)){
                pre.push(cur)
            }
            return pre;
        },[])

        console.log(arrResult)//结果:["name", "age", "long", "short"]

  • 对对象的属性求和
let person = [
    {
        name: 'xiaoming',
        age: 18
    },{
        name: 'xiaohong',
        age: 17
    },{
        name: 'xiaogang',
        age: 19
    }
]

let result = person.reduce((a,b) =>{
    a = a + b.age;
    return a;
},0)

console.log(result)//结果:54

array.reduceRight(function(total, currentValue, currentIndex, arr), initialValue) : 对数组里每个元素执行一次回调函数。将数组元素计算为一个值(从右到左),用法同 reduce,顺序不同而已。

  1. function : 必需。用于执行每个数组元素的函数。
  2. total : 必需。初始值, 或者计算结束后的返回值。
  3. currentValue : 必需。当前元素
  4. currentIndex : 可选。当前元素的索引
  5. arr : 可选。当前元素所属的数组对象。
  6. initialValue :可选。传递给函数的初始值
  7. reduceRight() 对于空数组是不会执行回调函数的。
posted @ 2021-12-29 17:31  较瘦  阅读(484)  评论(0编辑  收藏  举报
知识点文章整理