Javascript處理數組基礎知識(含es6新語法)

迭代方法

1.every()

對數組中每一項進行給定函數,若是每一項都返回true,則返回true。前端

every(callback(element,index,array), thisArg)
  • callback:必需,對數組每一項所要執行的函數。
  • thisArg:可選,規定callback回調函數this所指向的對象。
var numbers = [1,2,3,4,5,4,3,2,1];
var everyResult = numbers.every(function(item,index,array){
    return item>2;
});
console.log(everyResult); //false
var numbers = [1,2,3,4,5,4,3,2,1];
var obj = {num:2}
var everyResult = numbers.every(function(item,index,array){
    return item>this.num;
},obj);
console.log(everyResult);  //false

特別說明:第一個參數是回調函數,第二個參數是一個對象,它能夠重置回調函數中this的指向。那麼,上述代碼中回調函數的this就指向obj,因而this.num值等於2。數組

2.some()

對數組中每一項進行給定函數,若是任意一項都返回true,則返回true函數

some(callback(element,index,array), thisArg)
  • callback:必需,對數組每一項所要執行的函數。
  • thisArg:可選,規定callback回調函數this所指向的對象。
var numbers = [1,2,3,4,5,4,3,2,1];
var someResult = numbers.some(function(item,index,array){
    return item>2;
});
console.log(someResult);   //true

var numbers = [1,2,3,4,5,4,3,2,1];
var obj = {num:2}
var someResult = numbers.some(function(item,index,array){
    return item>this.num;
},obj);
console.log(someResult);  //true

3.filter()

對數組中每一項進行給定函數,返回該函數會返回true的項組成新的數組。this

filter(callback(element,index,array), thisArg)
  • callback:必需,對數組每一項所要執行的函數。
  • thisArg:可選,規定callback回調函數this所指向的對象。
var numbers = [1,2,3,4,5,4,3,2,1];
var filterResult = numbers.filter(function(item,index,array){
    return item>2;
});
console.log(filterResult);   //  [3,4,5,4,3]
var numbers = [1,2,3,4,5,4,3,2,1];
var obj = {num:2}
var filterResult = numbers.filter(function(item,index,array){
    return item>this.num;
},obj);
console.log(filterResult);   //  [3,4,5,4,3]

4.map()

對數組中每一項進行給定函數,返回每次函數調用的結果組成的新數組。code

map(callback(element,index,array), thisArg)
  • callback:必需,對數組每一項所要執行的函數。
  • thisArg:可選,規定callback回調函數this所指向的對象。
var numbers = [1,2,3,4,5,4,3,2,1];
var mapResult = numbers.map(function(item,index,array){
    return item*2;
});
alert(mapResult);   //  [2, 4, 6, 8, 10, 8, 6, 4, 2]
var numbers = [1,2,3,4,5,4,3,2,1];
var obj = {num:2}
var mapResult = numbers.map(function(item,index,array){
    return item*this.num;
},obj);
alert(mapResult);   //  [2, 4, 6, 8, 10, 8, 6, 4, 2]

5.forEach()

對數組中每一項進行給定函數,沒有返回值,和for循環相似。對象

forEach(callback(element,index,array), thisArg)
  • callback:必需,對數組每一項所要執行的函數。
  • thisArg:可選,規定callback回調函數this所指向的對象。
var numbers = [1,2,3,4,5,4,3,2,1];
numbers.forEach(function(item,index,array){
  console.log(item*2)
});
//2, 4, 6, 8, 10, 8, 6, 4, 2

console.log(numbers) //1,2,3,4,5,4,3,2,1
var numbers = [1,2,3,4,5,4,3,2,1];
var obj = {num:2}
numbers.forEach(function(item,index,array){
  console.log(item*this.num)
},obj);
//2, 4, 6, 8, 10, 8, 6, 4, 2

歸併方法

ES5新增了兩個歸併數組的方法:reduce(callback(prev,cur,index,array))和reduceRight(callback(prev,cur,index,array))。這兩個方法迭代數組全部項,而後構建一個最終返回的值。reduce從左到右,reduceRight從右到左。排序

  • prev:前一個值
  • cur:當前值
  • index:下標
  • array:數組對象
var numbers = [1,2,3,4,5];
var sum = numbers.reduce(function(prev,cur,index,array){
    return prev + cur;
});
console.log(sum); //15

這個函數返回的任何值都會做爲第一個參數自動傳給下一項。第一次迭代發生在第二項上,所以第一個參數是數組的第一項,第二個參數是數組的第二項。索引

檢測數組

1.instanceof

ES3的方法接口

var numbers = [1,2,3];
if(numbers instanceof Array){
    //對數組進行某些操做
}

2.Array.isArray

ES5的方法隊列

var numbers = [1,2,3];
if(Array.isArray(numbers)){
    //對數組進行某些操做
}

數組轉化成字符串

1.toLocaleString() toString()

var numbers = [1,2,3];
console.log(numbers.toLocaleString())  //1,2,3
console.log(numbers.toString())//1,2,3

2.join()

將數組轉換爲字符串,且用分隔符分割

var numbers = [1,2,3];
alert(numbers.join("|"));  // 1|2|3

棧方法

棧方法是指Last-In-First-Out後進先出

push() 從數組末尾添加
pop()  從數組末尾移除

隊列方法

隊列方法是First-In-First-Out先進先出

shift()    從數組前端移除
unshift()  從數組前端添加

重排序方法

1.reverse()

反轉數組

var numbers = [1,2,3];
console.log(numbers.reverse())  //3,2,1

2.sort()

var numbers = [0,1,5,10,15];
numbers.sort(function(a,b){
    return b-a;
});
console.log(numbers);  //[15, 10, 5, 1, 0]

操做方法

1.concat()

用於複製或者從尾部添加,建立新數組。

concat(n1,n2,...,nN)
  • n1,n2,...,nN:均可選,既能夠是數組,也能夠是單個字符。
var numbers = [1,2,3];
var n1 = values.concat();  //複製
var n2 = values.concat(4);  //尾部添加
var n3 = n1.concat(n2,10,11); //尾部添加

console.log(numbers);  //[1,2,3]
console.log(n1);      //[1,2,3]
console.log(n2);      //[1,2,3,4]
console.log(n3);      //[1, 2, 3, 1, 2, 3, 4,10,11]

2.slice()

用於複製或截取數組,建立新數組。

slice(start,end)
  • strat:可選,數組其實位置,截取的時候包括其實位置
  • end:可選,結束位置,截取的時候不包括結束位置
var numbers = [1,2,3];
var n1 = numbers.slice(); //複製
var n2 = numbers.slice(1); //截取
var n3 = numbers.slice(1,3); //截取

console.log(numbers);  //[1,2,3]
console.log(n1);      //[1,2,3]
console.log(n2);      //[2,3]
console.log(n3);      //[2,3]

3.splice()

用於刪除、插入、替換,號稱最強大的數組方法

  • 刪除:能夠刪除任意數量的項,須要兩個參數,要刪除的第一項的位置和要刪除的項數
splice(start,num)

var values = [1,2,3,4,5,6];
var v = values.splice(0,2);
console.log(values);  //[3,4,5,6]
console.log(v);       //[1,2]
  • 插入和替換:至少三個參數,第一個是起始位置,第二個是要刪除的項數,第三個及之後是要插入或替換的值。
splice(start,num,n1,n2,...,nN)

//插入demo
var values = [1,2,3,4,5,6];
var v1 = values.splice(1,0,1,1,1);
console.log(values);  //[1,1,1,1,2,3,4,5,6]
console.log(v1);      //[]

//替換demo
var values = [1,2,3,4,5,6];
var v1 = values.splice(1,2,1,1,1);
console.log(values);  //[1,1,1,1,4,5,6]
console.log(v1);       //[2,3]

位置方法

indexOf(value,start)
lastIndexOf(value,start)

都接受兩個參數:查找的值、查找起始位置。不存在,返回 -1 ;存在,返回位置。
indexOf 是從前日後查找, lastIndexOf 是從後往前查找。

var numbers = [1,2,3,4,5,6,7,8,9,5,3];
console.log(numbers.indexOf(5))  //4
console.log(numbers.lastIndexOf(5))  //9

ES6新增新操做數組的方法

1.find()

傳入一個回調函數,找到數組中符合當前搜索規則的第一個元素,返回它,而且終止搜索。

find(callback(element,index,array), thisArg)
  • callback:必需,回調函數,它制定了對數組元素的檢索規則。
  • thisArg:可選,用來規定回調函數中this所指向的對象。
let arr = [2,3,4,5,6,7,8,9,10];
let elem=arr.find(function (ele) {
  if (ele > 4) {
    return true
  }
})
console.log(elem); //5
let arr = [2,3,4,5,6,7,8,9,10];
let obj = {num: 4};
let elem=arr.find(function (ele) {
  if (ele > this.num) {
    return true
  }
},obj)
console.log(elem); //5

2.findIndex()

傳入一個回調函數,找到數組中符合當前搜索規則的第一個元素,返回它的下標,終止搜索。

findIndex(callback(element,index,array), thisArg)
  • callback:必需,回調函數,它制定了對數組元素的檢索規則。
  • thisArg:可選,用來規定回調函數中this所指向的對象。
let arr = [2,3,4,5,6,7,8,9,10];
let elem=arr.findIndex(function (ele) {
  if (ele > 4) {
    return true
  }
})
console.log(elem);  //3
let arr = [2,3,4,5,6,7,8,9,10];
let obj = {num: 4};
let elem=arr.findIndex(function (ele) {
  if (ele > this.num) {
    return true
  }
},obj)
console.log(elem);  //3

3.fill()

用新元素替換掉數組內的元素,能夠指定替換下標範圍。

fill(value,start,end)
  • value:必需,用來進行填充的值。
  • start:可選,規定填充開始位置,默認從索引0處開始。
  • end:可選,規定填充結束位置,默認填充到數組結尾。
const arr = ['a', 'b', 'c', 'd']
console.log(arr.fill('ss', 1, 3))  // ["a", "ss", "ss", "d"]

const arr2 = ['a', 'b', 'c', 'd']
console.log(arr.fill('ss'))  // ["ss", "ss", "ss", "ss"]

4.includes()

判斷數組中是否存在該元素,能夠替換 ES5 時代的 indexOf 判斷方式。

includes(value,start)
  • value:必需,要檢測的元素。
  • start:可選,規定填充開始位置,默認從索引0處開始。
let arr = ['a', 'b','c', 'd', NaN]
arr.includes('a') //true
arr.includes(NaN) //true
arr.indexOf(NaN) //-1

5.Array.from()

方法能夠將指定的參數轉換爲真正的數組。固然並非任意參數都是能夠被轉換爲數組,能夠轉換的參數以下:類數組對象具備遍歷器接口的對象

Array.from(arrayLike, mapFn, thisArg)
  • arrayLike:必需,將要被轉換爲真正數組的類數組或者具備遍歷器接口的對象。
  • mapFn:可選,對參數arrayLike中的數據進行處理並返回,做爲新數組的元素。
  • thisArg:可選,規定mapFn的調用對象,那麼mapFn中的this將會指向此調用對象。
let obj = {
  "0": "螞蟻部落",
  "1": "www.softwhy.com",
  "2": 6,
  "3":"ES2015",
  length:4
};
console.log(Array.from(obj)); // ["螞蟻部落", "www.softwhy.com", 6, "ES2015"]

obj = {
  "a": "螞蟻部落",
  "b": "www.softwhy.com",
  "c": 6,
  "d":"ES2015",
  length:4
};
console.log(Array.from(obj)); //[undefined, undefined, undefined, undefined]

obj = {
  length:3
};
console.log(Array.from(obj)); //[undefined, undefined, undefined]

上述代碼將類數組對象轉換爲真正的數組,什麼是類數組對象:不少材料上對類數組的描述比較嚴苛,其實很簡單,只要一個對象具備length屬性就是類數組。固然一個類數組對象,若是屬性剛好相似於數組遞增式索引,那就更好了,好比上面代碼中的對象。上面對象只有一個length屬性,他也是一個類數組對象,只不過生成的數組元素都是undefined。

let str = "螞蟻部落";
console.log(Array.from(str)); // ["螞", "蟻", "部", "落"]

由於字符串具備遍歷器接口,那麼字符串也能夠生成數組,數組的每個元素,就是構成字符串的字符。

let obj = {
  "0": 1,
  "1": 2,
  "2": 3,
  "3": 4,
  length:4
};
let thisObj = {
  num:2
}
console.log(Array.from(obj, function (elem, index) {
  return elem * this.num
}, thisObj)); //[2, 4, 6, 8]

擴展:展開運算符生成數組

let str="螞蟻部落";
console.log([...str]);  //["螞", "蟻", "部", "落"]

6.Array.of()

Array.of(element0,element1,...,elementN)

此方法能夠接受任意類型的參數,參數之間用逗號分隔,而且可以將參數轉換爲數組。

console.log(Array.of(2)); //[2]
console.log(Array.of(2,3,4)); //[2,3,4]

擴展:Array()與Array.of()方法區別

console.log(Array(2)) // [undefined, undefined]
console.log(Array.of(2)) // [2]

console.log(Array(2,3,4)) // [2,3,4]
console.log(Array.of(2,3,4)) // [2,3,4]

這個方法的主要目的,是彌補數組構造函數 Array() 的不足。

7.entries()

返回迭代器:返回一個遍歷器對象【鍵值對】

//數組
const arr = ['a', 'b', 'c'];
for(let v of arr.entries()) {
  console.log(v)
}
// [0, 'a'] [1, 'b'] [2, 'c']
for(let [key, value] of arr.entries()) {
  console.log(key+'--'+value)
}
//0--a 1--b 2--c

//Set
const arr = new Set(['a', 'b', 'c']);
for(let v of arr.entries()) {
  console.log(v)
}
// ['a', 'a'] ['b', 'b'] ['c', 'c']

//Map
const arr = new Map();
arr.set('a', 'a');
arr.set('b', 'b');
for(let v of arr.entries()) {
  console.log(v)
}
// ['a', 'a'] ['b', 'b']

8.keys()

返回迭代器:返回鍵值對的key

//數組
const arr = ['a', 'b', 'c'];
for(let v of arr.keys()) {
  console.log(v)
}
// 0 1 2

//Set
const arr = new Set(['a', 'b', 'c']);
for(let v of arr.keys()) {
  console.log(v)
}
// 'a' 'b' 'c'

//Map
const arr = new Map();
arr.set('a', 'a');
arr.set('b', 'b');
for(let v of arr.keys()) {
  console.log(v)
}
// 'a' 'b'

9.values()

返回迭代器:返回鍵值對的value

//數組
const arr = ['a', 'b', 'c'];
for(let v of arr.values()) {
  console.log(v)
}
//'a' 'b' 'c'

//Set
const arr = new Set(['a', 'b', 'c']);
for(let v of arr.values()) {
  console.log(v)
}
// 'a' 'b' 'c'

//Map
const arr = new Map();
arr.set('a', 'a');
arr.set('b', 'b');
for(let v of arr.values()) {
  console.log(v)
}
相關文章
相關標籤/搜索