JS:数组的方法

341 阅读3分钟

A.数组的基本方法

1.改变原数组
shift() unshift() pop() push() splice() reverse() sort()
var arr = [1, 2, 3, 4, 5, 6, 7]

arr.shift();//[1] 返回索引值为 0 的元素
arr //[2, 3, 4, 5, 6, 7]

arr.unshift(1);//7 返回新数组长度,并将元素添加到数组最前面
arr //[1, 2, 3, 4, 5, 6, 7]

arr.pop()//7 移除数组最后一个元素并返回该元素
arr ////[1, 2, 3, 4, 5, 6]

arr.push(7)//7 返回新数组长度,并将元素添加到数组最后面
arr //[1, 2, 3, 4, 5, 6, 7]

arr.splice(2, 4, 8)//[3, 4, 5, 6]
arr //[1, 2, 8, 7]

arr.revers()//[7, 8, 2, 1] 颠倒数组中元素的顺序,并返回新数组
arr //[7, 8, 2, 1]

arr.sort()//[1, 2, 7, 8] 数组排序,并返回新数组
arr //[1, 2, 7, 8]
Array.prototype.splice(start, deleteCount?, ele1?, ele2?, ...) 从索引start开始,移除deleteCount个元素,并插入elestart:开始的位置,如果为负值则用startlength来确定起始位置;deleteCount?可选,如果省略,则移除索引后的所有元素。
var arr = [1, 2, 3, 4, 5, 6, 7]
arr.splice(3)//[4, 5, 6, 7]
arr//[1, 2, 3]
Array.prototype.sort(compareFunction?)排序是通过把元素转为字符串再进行比较,数字排序就出现问题
var arr = [11, 12, 8, 1, 7, 25]
arr.sort()//[1, 11, 12, 25, 7, 8]
【解决】 数字的升序排列
arr.sort(function (a, b){
    return a - b;//升序
});
2.不改变原数组
concat() slice() join()
var arr = ['a', 'b', 'c'];
arr.concat('d',['e', 'f'])//['a', 'b', 'c', 'd', 'e', 'f']
arr.slice(1,2);//['b']
arr.join('-');//a-b-c
Array.prototype.slice(begin?, end?)把数组从 begin 开始到 end (不包含end)的元素复制到新数组
var arr = [1, 2, 3, 4, 5, 6, 7]
arr.slice(1,5);//[ 2, 3, 4]
arr.slice(1);//[2, 3, 4, 5, 6, 7]
arr.slice();//[1, 2, 3, 4, 5, 6, 7]
Array.prototype.join(separator)将数组转为字符串,应用separator链接。默认','。join()会将undefinednull数组的空缺转为空字符。
[undefined, null].join('-');//'-'
[1, , 3].join('-');//'1--3'

B.数组的遍历方法

every() some() forEach() filter() map()
Array.prototype.every(callback, thisValue?),全部满足条件返回true,只要有一个不满足返回false。
Array.prototype.some(callback, thisValue?),只要有一个满足条件返回true,全部不满足返回false。
var arr = [1, 2, 3, 4, 5];
function isTrue(x){
    return x % 2 == 0;
}
arr.every(isTrue);//false
arr.some(isTrue);//true
forEach(function(currentValue, index, arr), thisValue)遍历数组。
function show(ele, index){
    console.log( ele + '-' + index);
}
[1,2].forEach(show);
//1-0 2-1
Array.prototype.map(callback, thisValue?)对每个元素应用回调函数,再输出。
[1, 2, 4].map(function (x){return 2*x})
//[2, 4, 8]
Array.prototype.filter(callback, thisValue?)对每个元素应用回调函数,再输出返回值为true的元素
[1, 2, 4].filter(function(x){return x % 2 == 0;}
//[2, 4]
//去除数组空缺
[1, , 3].filter(function(x){return true})
//[1, 3]
如果遇到空缺的数组every()some()都会跳过。forEach()会跳过空缺,但不会跳过undefined。map()也跳过,但是保留空缺。filter()去除空缺。

C.值的查找

Array.prototype.indexOf(searchValue, startIndex?)从数组的startIndex开始,查找searchValue,返回第一次出现这个值的索引,如果找不到返回-1。如果startIndex加上length
[1, 2, 3, 4, 5].indexOf(5)//4
[1, 2, 3, 4, 5].indexOf(6, 3)//-1
[1, 2, 3, 4, 5].indexOf(3, 4)//-1
[NaN].indexOf(NaN)//-1
Array.prototype.lastIndexOf(searchValue, startIndex?)反向查找。

D.reduce()

Array.prototype.reduce(callback, initialValue?)nitialValue为可选,写了nitialValue值那么函数的初始值为该nitialValue值,如果没有,那么函数数组的第一个值为初始值。
var arr = [1, 5, 8, 13];
var c = arr.reduce(function(pre, ele, index){
    return pre + ele;
},);
cosole.log(c);//1 + 5 + 8 + 13 = 27
var d = arr.reduce(function(pre, ele, index){
    return pre + ele;
},100);
cosole.log(d);//100 + 1 + 5 + 8 + 13 = 127

E.应用

随机排序【原理】随机 return 正数/负数 即 升序/降序
var arr = [1,2,11,23,33,4,15];
arr.sort(function (){
    return Math.random()-0.5;
});
数组去重【原理】把数组元素转化为对象的属性名
var arr = [1,1,1,1,1,2,2,3,4,5,5,5,5];
Array.prototype.unique = function (){
    var tem = {},
        arr = [],
        len = this.length;
    for(var i = 0; i < len; i ++){
        if(!tem[this[i]]){
            tem[this[i]] = "abc";
            arr.push(this[i]);
        }
    }
    console.log(tem);
    console.log(arr)
}
arr.unique();
//{1: "abc", 2: "abc", 3: "abc", 4: "abc", 5: "abc"}
//[1, 2, 3, 4, 5]