你不知道的JavaScript数组方法

作者: Funwt | 来源:发表于2017-08-18 00:31 被阅读226次

    concat

    var a = [1,2,3];
    a.concat([4,5,6],7,8);//[1,2,3,4,5,6,7,8] 
    

    注意,a数组并没有改变,只是返回了一个新数组。

    copyWithin

    它接受三个参数。
    target (必需):从该位置开始替换数据。
    start (可选):从该位置开始读取数据,默认为 0 。如果为负值,表示倒数。
    end (可选):到该位置前停止读取数据,默认等于数组长度。如果为负值,表示倒数。
    这三个参数都应该是数值,如果不是,会自动转为数值

    //  将 3 号位复制到 0 号位  
    [1, 2, 3, 4, 5].copyWithin(0, 3, 4)  
    // [4, 2, 3, 4, 5]  
    // -2 相当于 3 号位, -1 相当于 4 号位  
    [1, 2, 3, 4, 5].copyWithin(0, -2, -1)  
    // [4, 2, 3, 4, 5]  
    //  将 3 号位复制到 0 号位  
    [].copyWithin.call({length: 5, 3: 1}, 0, 3)  
    // {0: 1, 3: 1, length: 5}  
    //  将 2 号位到数组结束,复制到 0 号位  
    var i32a = new Int32Array([1, 2, 3, 4, 5]);  
    i32a.copyWithin(0, 2);  
    // Int32Array [3, 4, 5, 4, 5]  
    //  对于没有部署 TypedArray 的 copyWithin 方法的平台  
    //  需要采用下面的写法  
    [].copyWithin.call(new Int32Array([1, 2, 3, 4, 5]), 0, 3, 4);  
    // Int32Array [4, 2, 3, 4, 5]  
    

    entries

    var a = [1,2,3];
    var en = a.entries();
    en.next().value;//[0.1];
    

    返回一个迭代对象

    every

    function isBigEnough(element, index, array) {
      return (element >= 10);
    }
    var passed = [12, 5, 8, 130, 44].every(isBigEnough);
    // passed is false
    passed = [12, 54, 18, 130, 44].every(isBigEnough);
    // passed is true
    

    每项都通过测试函数返回true,否则返回false

    fill

    [1, 2, 3].fill(4)            // [4, 4, 4]
    [1, 2, 3].fill(4, 1)         // [1, 4, 4]
    [1, 2, 3].fill(4, 1, 2)      // [1, 4, 3]
    [1, 2, 3].fill(4, 1, 1)      // [1, 2, 3]
    [1, 2, 3].fill(4, -3, -2)    // [4, 2, 3]
    [1, 2, 3].fill(4, NaN, NaN)  // [1, 2, 3]
    Array(3).fill(4);            // [4, 4, 4]
    [].fill.call({length: 3}, 4) // {0: 4, 1: 4, 2: 4, length: 3}
    

    改变的是数组本身

    filter

    function isBigEnough(value) {
      return value >= 10;
    }
    var filtered = [12, 5, 8, 130, 44].filter(isBigEnough);
    // filtered is [12, 130, 44]
    

    返回一个新的数组

    find

    方法返回数组中满足提供的测试函数的第一个元素的值。否则返回 undefind

    function isBigEnough(element) {
      return element >= 15;
    }
    [12, 5, 8, 130, 44].find(isBigEnough); // 130
    

    findIndex

    findIndex()方法返回数组中满足提供的测试函数的第一个元素的索引。否则返回-1。

    function isBigEnough(element) {
      return element >= 15;
    }
    [12, 5, 8, 130, 44].findIndex(isBigEnough); // 3
    

    forEach

    let a = ['a', 'b', 'c'];
    
    a.forEach(function(element) {
        console.log(element);
    });
    // a
    // b
    // c
    //语法
    array.forEach(callback(currentValue, index, array){
        //do something
    }, this)
    array.forEach(callback[, thisArg])
    

    callback
    为数组中每个元素执行的函数,该函数接收三个参数:
    currentValue(当前值)
    数组中正在处理的当前元素。
    index(索引)
    数组中正在处理的当前元素的索引。
    array
    forEach()方法正在操作的数组。
    thisArg可选
    可选参数。当执行回调 函数时用作this的值(参考对象)

    注意: 没有办法中止或者跳出 forEach 循环,除了抛出一个异常。如果你需要这样,使用forEach()方法是错误的,你可以用一个简单的循环作为替代。如果您正在测试一个数组里的元素是否符合某条件,且需要返回一个布尔值,那么可使用 Array.every,Array.some。如果可用,新方法 find()或者findIndex()也可被用于真值测试的提早终止。

    include

    arr.includes(searchElement)
    arr.includes(searchElement, fromIndex)
    

    参数
    searchElement
    需要查找的元素值。
    fromIndex
    可选
    从该索引处开始查找 searchElement
    。如果为负值,则按升序从 array.length + fromIndex 的索引开始搜索。默认为 0。
    返回值
    一个 Boolean。

    [1, 2, 3].includes(2);     // true
    [1, 2, 3].includes(4);     // false
    [1, 2, 3].includes(3, 3);  // false
    [1, 2, 3].includes(3, -1); // true
    [1, 2, NaN].includes(NaN); // true
    

    indexOf

    arr.indexOf(searchElement)
    arr.indexOf(searchElement[, fromIndex = 0])
    

    参数
    searchElement
    要查找的元素
    fromIndex
    开始查找的位置。如果该索引值大于或等于数组长度,意味着不会在数组里查找,返回-1。如果参数中提供的索引值是一个负值,则将其作为数组末尾的一个抵消,即-1表示从最后一个元素开始查找,-2表示从倒数第二个元素开始查找 ,以此类推。 注意:如果参数中提供的索引值是一个负值,仍然从前向后查询数组。如果抵消后的索引值仍小于0,则整个数组都将会被查询。其默认值为0.
    返回值
    首个被找到的元素在数组中的索引位置; 若没有找到则返回 -1

    let a = [2, 9, 7, 8, 9]; 
    a.indexOf(2); // 0 
    a.indexOf(6); // -1
    a.indexOf(7); // 2
    a.indexOf(8); // 3
    a.indexOf(9); // 1
    if (a.indexOf(3) === -1) {
      // element doesn't exist in array
    }
    

    join

    str = arr.join()
    // 默认为 ","
    
    str = arr.join("")
    // 分隔符 === 空字符串 ""
    
    str = arr.join(separator)
    // 分隔符
    

    keys

    keys() 方法返回一个新的Array迭代器,它包含数组中每个索引的键

    let arr = ["a", "b", "c"];
    
    let iterator = arr.keys();
    // undefined
    
    console.log(iterator);
    // Array Iterator {}
    
    console.log(iterator.next()); 
    // Object {value: 0, done: false}
    
    console.log(iterator.next()); 
    // Object {value: 1, done: false}
    
    console.log(iterator.next()); 
    // Object {value: 2, done: false}
    
    console.log(iterator.next()); 
    // Object {value: undefined, done: true}
    

    map

    map() 方法创建一个新数组,其结果是该数组中的每个元素都调用一个提供的函数后返回的结果。

    let array = arr.map(function callback(currentValue, index, array) { 
        // Return element for new_array 
    }[, thisArg])
    
    
    let numbers = [1, 5, 10, 15];
    let doubles = numbers.map((x) => {
       return x * 2;
    });
    // doubles is now [2, 10, 20, 30]
    // numbers is still [1, 5, 10, 15]
    let numbers = [1, 4, 9];
    let roots = numbers.map(Math.sqrt);
    // roots is now [1, 2, 3]
    // numbers is still [1, 4, 9]
    

    callback
    生成新数组元素的函数,使用三个参数:
    currentValue
    callback 的第一个参数,数组中正在处理的当前元素。
    index
    callback 的第二个参数,数组中正在处理的当前元素的索引。
    array
    callback 的第三个参数,map 方法被调用的数组。
    thisArg
    可选的。执行 callback 函数时 使用的this 值。
    返回值
    一个新数组,每个元素都是回调函数的结果。

    pop和push

    pop()方法从数组中删除最后一个元素,并返回该元素的值。此方法更改数组的长度。
    push() 方法将一个或多个元素添加到数组的末尾,并返回数组的新长度。

    arr.push(element1, ..., elementN)
    

    合并两个数组
    该示例使用 apply() 添加第二个数组的所有元素。
    注意当第二个数组(如示例中的moreVegs)太大时不要使用这个方法来合并数组,因为事实上一个函数能够接受的参数个数是有限制的。具体可以参考 apply()

    var vegetables = ['parsnip', 'potato'];
    var moreVegs = ['celery', 'beetroot'];
    // 将第二个数组融合进第一个数组
    // 相当于 vegetables.push('celery', 'beetroot');
    Array.prototype.push.apply(vegetables, moreVegs);
    console.log(vegetables); 
    // ['parsnip', 'potato', 'celery', 'beetroot']
    

    reduce和reduceRight

    reduce() 方法对累加器和数组中的每个元素 (从左到右)应用一个函数,将其减少为单个值。

    array.reduce(function(accumulator, currentValue, currentIndex, array), initialValue)
    
    
    var total = [0, 1, 2, 3].reduce(function(sum, value) {
      return sum + value;
    }, 0);
    // total is 6
    
    var flattened = [[0, 1], [2, 3], [4, 5]].reduce(function(a, b) {
      return a.concat(b);
    }, []);
    // flattened is [0, 1, 2, 3, 4, 5]
    

    callback
    执行数组中每个值的函数,包含四个参数
    accumulator
    上一次调用回调返回的值,或者是提供的初始值(initialValue)
    currentValue
    数组中正在处理的元素
    currentIndex
    数据中正在处理的元素索引,如果提供了 initialValue ,从0开始;否则从1开始
    array
    调用 reduce 的数组
    initialValue
    可选项,其值用于第一次调用 callback 的第一个参数。如果没有设置初始值,则将数组中的第一个元素作为初始值。空数组调用reduce时没有设置初始值将会报错。

    PS: 与 reduceRight()和reduce() 的执行方向相反

    reverse

    reverse 方法颠倒数组中元素的位置,并返回该数组的引用。

    shift与unshift

    shift() 方法从数组中删除第一个元素,并返回该元素的值。此方法更改数组的长度。
    unshift() 方法将一个或多个元素添加到数组的开头,并返回新数组的长度。

    slice

    slice() 方法返回一个从开始到结束(不包括结束)选择的数组的一部分浅拷贝到一个新数组对象。原始数组不会被修改。

    arr.slice();
    //[0,end];
    arr.slice(start);
    //[start,end];
    arr.slice(start,end);
    //[start,end];
    

    slice不修改原数组,只会返回一个浅复制了原数组中的元素的一个新数组。原数组的元素会按照下述规则拷贝:
    如果该元素是个对象引用 (不是实际的对象),slice会拷贝这个对象引用到新的数组里。两个对象引用都引用了同一个对象。如果被引用的对象发生改变,则新的和原来的数组中的这个元素也会发生改变。
    对于字符串、数字及布尔值来说不是String、Number或者Boolean,slice会拷贝这些值到新的数组里。在别的数组里修改这些字符串或数字或是布尔值,将不会影响另一个数组。
    如果向两个数组任一中添加了新元素,则另一个不会受到影响

    some

    some() 方法测试数组中的某些元素是否通过由提供的函数实现的测试。

    const isBiggerThan10 = (element, index, array) => {
      return element > 10;
    }
    [2, 5, 8, 1, 4].some(isBiggerThan10);  
    // false
    [12, 5, 8, 1, 4].some(isBiggerThan10); 
    // true
    

    toLocaleString与toString

    toLocaleString() 返回一个字符串表示数组中的元素。数组中的元素将使用各自的 toLocaleString 方法转成字符串,这些字符串将使用一个特定语言环境的字符串(例如一个逗号 ",")隔开。

    var number = 1337;
    var date = new Date();
    var myArr = [number, date, "foo"];
    var str = myArr.toLocaleString(); 
    console.log(str); 
    // 输出 "1,337,2017/8/13 下午8:32:24,foo"
    // 假定运行在中文(zh-CN)环境,北京时区
    
    var a=1234
    
    a.toString()
    //"1234"
    
    a.toLocaleString()
    //"1,234"
    //当数字是四位及以上时,toLocaleString()会让数字三位三位一分隔,像我们有时候数字也会三位一个分号
    var sd=new Date()
    sd
    //Wed Feb 15 2017 11:21:31 GMT+0800 (CST)
    sd.toLocaleString()
    //"2017/2/15 上午11:21:31"
    sd.toString()
    //"Wed Feb 15 2017 11:21:31 GMT+0800 (CST)"
    
    image.png

    splice

    splice() 方法通过删除现有元素和/或添加新元素来更改一个数组的内容。

    array.splice(start)
    array.splice(start, deleteCount) 
    array.splice(start, deleteCount, item1, item2, ...)
    

    start​
    指定修改的开始位置(从0计数)。如果超出了数组的长度,则从数组末尾开始添加内容;如果是负值,则表示从数组末位开始的第几位(从1计数)。
    deleteCount 可选
    整数,表示要移除的数组元素的个数。如果 deleteCount 是 0,则不移除元素。这种情况下,至少应添加一个新元素。如果 deleteCount 大于start 之后的元素的总数,则从 start 后面的元素都将被删除(含第 start 位)。
    如果deleteCount被省略,则其相当于(arr.length - start)。
    item1, item2, ... 可选
    要添加进数组的元素,从start 位置开始。如果不指定,则 splice() 将只删除数组元素。
    返回值
    由被删除的元素组成的一个数组。如果只删除了一个元素,则返回只包含一个元素的数组。如果没有删除元素,则返回空数组。

    相关文章

      网友评论

        本文标题:你不知道的JavaScript数组方法

        本文链接:https://www.haomeiwen.com/subject/uakorxtx.html