關於es6中新增的一些方法----數組篇


  要問互聯網開發這塊最難的是什么方面,我覺得大多數人的回答都是前端開發這塊,因為前端這塊技術更新換代實在是過於快速,也許沒有多少時間就有大量的新技術面世了,想要在這行保持競爭力就必須要又一個持續學習的習慣,正所謂活到老,學到老來形容前端開發這塊是最合適不過了

  今天筆者就來總結以下在es6中數組新增的一些方法,首先我來告訴大家如何查看數組中都有哪些方法,只需要在網頁中打開我們的控制台,輸入  []._proto_  就可以看到數組中現在都有哪些已經支持的方法了,下面給大家一張圖看下

如上圖所示,是不是發現有很多方法比較陌生,有的可能是我們之前已經掌握的,有的則是新支持的方法,現在筆者就來帶大家一起來看一下這些新增的方法啦(這里呢筆者就簡單介紹一下筆者尚未完全掌握的方法,至於其他的方法,如果同學們有疑問的話可以來找筆者進行討論,筆者的聯系方式在第一篇博客中有所體現,有興趣的小伙伴可以去看下哦)

 

1、find()方法,筆者在實際開發中對於這個方法使用的很少,所以來記錄一下

   作用:find()函數用來查找目標元素,找到就返回該元素,找不到返回undefined。

   參數:

  查找函數有三個參數。

  value:每一次迭代查找的數組元素。

  index:每一次迭代查找的數組元素索引。

  arr:被查找的數組

   示例:

const arr1 = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11]
var ret1 = arr1.find((value, index, arr1) => {
 return value > 4
})
var ret2 = arr1.find((value, index, arr1) => {
 return value > 14
})
console.log('%s', ret1)//5
console.log('%s', ret2)//undefined

這個比較簡單,就是在數組中查找我們定義的滿足條件的元素,如果查詢到就返回這個元素,查不到就返回undefined

 

2、findIndex()同上

  作用:findIndex()函數也是查找目標元素,找到就返回元素的位置,找不到就返回-1。

  同樣是接收三個參數,同上

示例:

const arr1 = [1,2,3,4,5,6,7,8,9];
var ret3 = arr1.findIndex((value, index, arr1) => {
 return value > 4
})
 
var ret4 = arr1.findIndex((value, index, arr1) => {
 return value > 14
})
console.log('%s', ret3)//4
console.log('%s', ret4)//-1

這個也不多說了,想必大家也都很好理解

 

3、copyWithin() 這個函數筆者之前確實不知到這個函數,所以查詢了很多資料,最后總結在這里

 作用:copyWithin() 方法用於從數組的指定位置拷貝元素到數組的另一個指定位置中,該方法會改變原數組

 參數:

  target:必需,復制到指定目標索引位置

  start: 可選,元素復制的起始位置

      end: 可選,停止復制的索引位置(默認為array.length),如果為負值,表示倒數

  示例:

var fruits = ["Banana", "Orange", "Apple", "Mango", "Kiwi", "Papaya"];
fruits.copyWithin(2, 0, 2);

console.log(fruits)//["Banana", "Orange", "Banana", "Orange", "Kiwi", "Papaya"]

筆者在整理這個博客的時候遇到一個很有意思的題目,大家可以思考一下:

 
 var obj =  [].copyWithin.call({length: 5, 3: 1}, 0, 3);
 
 console.log(obj)//?這里會輸出什么?為什么?大家積極思考一下

 

4、flat() flat() 方法會按照一個可指定的深度遞歸遍歷數組,並將所有元素與遍歷到的子數組中的元素合並為一個新數組返回。

 參數:

   depth :可選,指定要提取嵌套數組的結構深度,默認值為 1。

 返回值:

 一個包含將數組與子數組中所有元素的新數組。

示例:

var arr1 = [1, 2, [3, 4]];
arr1.flat(); 
// [1, 2, 3, 4]

var arr2 = [1, 2, [3, 4, [5, 6]]];
arr2.flat();
// [1, 2, 3, 4, [5, 6]]

var arr3 = [1, 2, [3, 4, [5, 6]]];
arr3.flat(2);
// [1, 2, 3, 4, 5, 6]

//使用 Infinity 作為深度,展開任意深度的嵌套數組
arr3.flat(Infinity); 
// [1, 2, 3, 4, 5, 6]

注意:該方法會默認移除數組中的空項(此處空項不包含指為false的項)

var arr = [1,2,3,4,5,,6,'',false,null,undefined,9];
console.log(arr.flat())//[1, 2, 3, 4, 5, 6, "", false, null, undefined, 9]

 

 5、flatmap() flatMap() 方法首先使用映射函數映射每個元素,然后將結果壓縮成一個新數組。它與 map 和 深度值1的 flat 幾乎相同,但 flatMap 通常在合並成一種方法的效率稍微高一些

  參數:

   callback:

  可以生成一個新數組中的元素的函數,可以傳入三個參數:

   currentValue
  當前正在數組中處理的元素
   index 可選
  可選的。數組中正在處理的當前元素的索引。
   array 可選
  可選的。被調用的  map 數組

   thisArg:可選的。執行 callback 函數時 使用的this 值。

返回值:

   一個新的數組,其中每個元素都是回調函數的結果,並且結構深度 depth 值為1。

示例:

let arr = ["今天天氣不錯", "", "早上好"]

arr.map(s => s.split(""))
// [["今", "天", "天", "氣", "不", "錯"],[""],["早", "上", "好"]]

arr.flatMap(s => s.split(''));
// ["今", "天", "天", "氣", "不", "錯", "", "早", "上", "好"]// 只會將 flatMap 中的函數返回的數組 “壓平” 一層

 

6、fill() fill() 方法用一個固定值填充一個數組中從起始索引到終止索引內的全部元素。不包括終止索引。

  arr.fill(value[, start[, end]])

參數:

value 用來填充數組元素的值。

start 可選 起始索引,默認值為0。
  end  可選 終止索引,默認值為  this.length
返回值:修改后的數組
描述:

fill 方法接受三個參數 valuestart 以及 endstart 和 end 參數是可選的, 其默認值分別為 0 和 this 對象的 length 屬性值。

如果 start 是個負數, 則開始索引會被自動計算成為 length+start, 其中 length 是 this 對象的 length 屬性值。如果 end 是個負數, 則結束索引會被自動計算成為 length+end

fill 方法故意被設計成通用方法, 該方法不要求 this 是數組對象。

fill 方法是個可變方法, 它會改變調用它的 this 對象本身, 然后返回它, 而並不是返回一個副本。

當一個對象被傳遞給 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, 3);         // [1, 2, 3]
[1, 2, 3].fill(4, -3, -2);       // [4, 2, 3]
[1, 2, 3].fill(4, NaN, NaN);     // [1, 2, 3]
[1, 2, 3].fill(4, 3, 5);         // [1, 2, 3]
Array(3).fill(4);                // [4, 4, 4]
[].fill.call({ length: 3 }, 4);  // {0: 4, 1: 4, 2: 4, length: 3}

// Objects by reference.
var arr = Array(3).fill({}) // [{}, {}, {}];
arr[0].hi = "hi"; // [{ hi: "hi" }, { hi: "hi" }, { hi: "hi" }],這里前面說到過,填充數組的是對這個對象的引用

以下介紹下關於Array的幾個方法

1、Array.of()  Array.of() 方法創建一個具有可變數量參數的新數組實例,而不考慮參數的數量或類型。Array.of() 和 Array 構造函數之間的區別在於處理整數參數:Array.of(7) 創建一個具有單個元素 7 的數組,而 Array(7) 創建一個長度為7的空數組(注意:這是指一個有7個空位的數組,而不是由7個undefined組成的數組)。

參數:任意個參數,將按順序成為返回數組中的元素

返回值:新的Array實例

示例:

Array.of(7);       // [7] 
Array.of(1, 2, 3); // [1, 2, 3]

Array(7);          // [ , , , , , , ]
Array(1, 2, 3);    // [1, 2, 3]

 

2、Array.from() Array.from() 方法從一個類似數組或可迭代對象中創建一個新的數組實例。

參數:

 arrayLike  想要轉換成數組的偽數組對象或可迭代對象。

 mapFn (可選參數)如果指定了該參數,新數組中的每個元素會執行該回調函數。

 thisArg (可選參數)可選參數,執行回調函數 mapFn 時 this 對象。

返回值:一個新的數組實例

描述:

Array.from() 可以通過以下方式來創建數組對象:

  • 偽數組對象(擁有一個 length 屬性和若干索引屬性的任意對象)
  • 可迭代對象(可以獲取對象中的元素,如 Map和 Set 等)

Array.from() 方法有一個可選參數 mapFn,讓你可以在最后生成的數組上再執行一次 map方法后再返回。也就是說 Array.from(obj, mapFn, thisArg) 就相當於 Array.from(obj).map(mapFn, thisArg), 除非創建的不是可用的中間數組。 這對一些數組的子類,如  typed arrays 來說很重要, 因為中間數組的值在調用 map() 時需要是適當的類型。

from() 的 length 屬性為 1 ,即Array.from.length = 1

在 ES2015 中, Class 語法允許我們為內置類型(比如 Array)和自定義類新建子類(比如叫 SubArray)。這些子類也會繼承父類的靜態方法,比如 SubArray.from(),調用該方法后會返回子類 SubArray 的一個實例,而不是 Array 的實例。

示例代碼:

 

Array from a String節
Array.from('foo'); 
// ["f", "o", "o"]
Array from a Set節
let s = new Set(['foo', window]); 
Array.from(s); 
// ["foo", window]
Array from a Map節
let m = new Map([[1, 2], [2, 4], [4, 8]]);
Array.from(m); 
// [[1, 2], [2, 4], [4, 8]]
Array from an Array-like object (arguments)節
function f() {
  return Array.from(arguments);
}

f(1, 2, 3);

// [1, 2, 3]
在Array.from中使用箭頭函數節
// Using an arrow function as the map function to
// manipulate the elements
Array.from([1, 2, 3], x => x + x);  
// x => x + x代表這是一個函數,只是省略了其他的定義,這是一種Lambda表達式的寫法
// 箭頭的意思表示從當前數組中取出一個值,然后自加,並將返回的結果添加到新數組中    
// [2, 4, 6]


// Generate a sequence of numbers
// Since the array is initialized with `undefined` on each position,
// the value of `v` below will be `undefined`
Array.from({length: 5}, (v, i) => i);
// [0, 1, 2, 3, 4]
數組去重合並節
function combine(){ 
    let arr = [].concat.apply([], arguments);  //沒有去重復的新數組 
    return Array.from(new Set(arr));
} 

var m = [1, 2, 2], n = [2,3,3]; 
console.log(combine(m,n));                     // [1, 2, 3]

 

3、Array.isArray()  Array.isArray() 用於確定傳遞的值是否是一個 Array

  參數:obj,需要檢測的值

  返回值: 如果是數組就返回true,否則就返回false

  示例:

// 下面的函數調用都返回 true
Array.isArray([]);
Array.isArray([1]);
Array.isArray(new Array());
// 鮮為人知的事實:其實 Array.prototype 也是一個數組。
Array.isArray(Array.prototype); 

// 下面的函數調用都返回 false
Array.isArray();
Array.isArray({});
Array.isArray(null);
Array.isArray(undefined);
Array.isArray(17);
Array.isArray('Array');
Array.isArray(true);
Array.isArray(false);
Array.isArray({ __proto__: Array.prototype });

 

好了,今天關於數組的介紹就到這里了,下一遍我們會總結下關於object中比較常用或者說比較新的方法 ,本文資料來源於MDN,鏈接:https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/Array/isArray,有興趣的同學可以自行前往觀看,下次再會啦!

 

 


 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM