JavaScript 陣列 常用方法(二)

四冥發表於2021-10-20

寫在前面:續接上篇 JavaScript 陣列 常用方法
陣列常用方法第二彈來了;

some && every

描述:

every()與some()方法都是JS中陣列的迭代方法。

  • some方法對陣列中每個元素呼叫被提供的函式,如果有任何一個元素結果為 true 則返回 true 否則返回false
  • every方法對陣列中每個元素呼叫被提供的函式,如果所有元素結果為 true 則返回 true 否則返回false
  • some一直在找符合條件的值,一旦找到,則不會繼續迭代下去。
  • every從迭代開始,一旦有一個不符合條件,則不會繼續迭代下去。

注意:如果用一個空陣列對兩個方法進行測試:

  • _some_在任何情況下它返回的都是_false_
  • _every_在任何情況下它返回的都是_true_

語法:

兩個方法的語法是一樣的,只是返回的結果不同。

Array.some(callback(element, index, array), thisValue)
Array.every(callback(element, index, array), thisValue)

引數:

兩個函式的引數是一樣的。
callback與thisValue

引數 是否可選 描述
引數一 callback 必選 用來測試陣列的每個元素的函式
引數二 thisValue 可選 執行 callback 時,用於 this 的值。
物件作為該執行回撥時使用,傳遞給函式。
如果省略了 thisValue ,"this" 的值為 "undefined"
  1. callback的引數列表
引數 是否可選 描述
引數一 element 必選 當前元素
引數二 index 可選 當前元素的索引值
引數三 array 可選 呼叫了 some && every 的陣列本身
  1. thisValue的引數

可選。要傳遞給函式以用作其 "this" 值的值。
如果此引數為空,則值 "undefined" 將作為其 "this" 值傳遞。

返回值:

返回值為布林(Boolean)值,

  • _some_如果有任何一個元素結果為 true 則返回 true 否則返回false
  • _every_如果所有元素結果為 true 則返回 true 否則返回false

示例:

const Array = [
  { name: "孫悟空", age: 3 },
  { name: "豬八戒", age: 4 },
  { name: "沙和尚", age: 5 },
];

// 檢查陣列中是否有人 age 為 4
let some = Array.some(  
  (item) => {
    return item.age === 4;
  }
);

// 檢查陣列中是否所有人 age 為 4
let every = Array.every( 
  (item) => {
    return item.age === 4;
  }
);
console.log(some); // true
console.log(every); // false

細節:

some && every 遍歷的元素範圍在第一次呼叫 callback 之前就已確定了。

在呼叫 some && every 之後新增到陣列中的元素不會被 callback 訪問到。如果陣列中存在的元素被更改,則他們傳入 callback 的值是some && every 訪問到他們那一刻的值。那些被刪除的元素或從來未被賦值的元素將不會被訪問到。

find && findIndex

描述:

find()與findIndex()方法都是JS中陣列用來查詢目標元素的方法。

  • find()方法對陣列中每個元素呼叫被提供的函式,如果滿足該函式,就返回滿足該函式的第一個元素的值,否則返回undefined
  • findIndex()方法對陣列中每個元素呼叫被提供的函式,如果滿足該函式,就返回滿足該函式的第一個元素的索引值,否則返回-1

簡單來說:

  • find()方法用來查詢目標元素,找到就返回該元素,找不到返回undefined
  • findIndex()方法查詢目標元素,找到就返回元素的位置,找不到就返回-1

這兩個方法區別在於返回值,一個返回陣列中找到的元素的值,一個返回陣列中找到的元素的索引。

語法:

兩個方法的語法是一樣的,只是返回的結果不同。

Array.find(callback(element, index, array), thisValue)
Array.findIndex(callback(element, index, array), thisValue)

引數:

兩個方法的引數是一樣的。
callback與thisValue

引數 是否可選 描述
引數一 callback 必選 用來測試陣列的每個元素的函式
引數二 thisValue 可選 執行 callback 時,用於 this 的值。
物件作為該執行回撥時使用,傳遞給函式。
如果省略了 thisValue ,"this" 的值為 "undefined"
  1. callback的引數列表
引數 是否可選 描述
引數一 element 必選 當前元素
引數二 index 可選 當前元素的索引值
引數三 array 可選 呼叫了 find && findIndex 的陣列本身
  1. thisValue的引數

可選。要傳遞給函式以用作其 "this" 值的值。
如果此引數為空,則值 "undefined" 將作為其 "this" 值傳遞。

返回值:

返回值不同:

  • find返回滿足所提供函式的第一個元素的值,否則返回undefined
  • findIndex返回滿足所提供函式的第一個元素元素的索引,否則返回-1

示例:

const Array = [
  { name: "孫悟空", age: 3 },
  { name: "豬八戒", age: 4 },
  { name: "沙和尚", age: 5 },
];

// 查詢陣列中 age 為 4 的值
let find = Array.find(  
  (item) => {
    return item.age === 4;
  }
);

// 查詢陣列中 age 為 4 元素的索引
let findIndex = Array.findIndex(
  (item) => {
    return item.age === 4;
  }
);

console.log(find); // { name: "豬八戒", age: 4 } 返回值為 value
console.log(findIndex); // 1 返回值為 索引值

細節:

find && findIndex方法在第一次呼叫callback函式時會確定元素的索引範圍

find && findIndex方法開始執行之後新增到陣列的新元素將不會被callback函式訪問到。如果陣列中一個尚未被callback函式訪問到的元素的值被callback函式所改變,那麼當callback函式訪問到它時,它的值是將是根據它在陣列中的索引所訪問到的當前值。被刪除的元素仍然會被訪問到。

slice && splice

描述:

slice()splice()方法都是JS中陣列用來刪除陣列元素並返回操作結果。

  • slice() 方法以新的陣列物件,返回陣列中被選中的元素。
  • splice() 方法通過刪除或替換現有元素或者原地新增新的元素來修改陣列,並以陣列形式返回被修改的內容。

splice用法不僅僅是刪除,它還能夠實現對陣列元素的刪除、插入、替換操作,返回值為被操作的值。

⚠️注意:_splice會導致陣列塌陷。陣列塌陷:使用splice刪除元素時,剩餘的陣列元素索引的順序會改變。

語法:

兩個方法的語法是不一樣的。

Array.slice(begin, end);
Array.splice(start, deleteCount, item1, item2, ... ,itemx);

引數:

兩個方法的引數是不一樣的。在 MDN 中這些引數是這樣描述的:

slice()的引數:
begin 與 end

引數 是否可選 描述
引數一 begin 可選 提取起始處的索引(從 0 開始)從該索引開始提取原陣列元素
引數二 end 可選 提取終止處的索引(從 0 開始)在該索引處結束提取原陣列元素
  1. begin
    • 提取起始處的索引(從 0 開始),從該索引開始提取原陣列元素。
    • 如果該引數為負數,則表示從原陣列中的倒數第幾個元素開始提取,slice(-2) 表示提取原陣列中的倒數第二個元素到最後一個元素(包含最後一個元素)。
    • 如果省略 begin,則 slice 從索引 0 開始。
    • 如果 begin 超出原陣列的索引範圍,則會返回空陣列。
  2. end
    • 提取終止處的索引(從 0 開始),在該索引處結束提取原陣列元素。slice 會提取原陣列中索引從 begin 到 end 的所有元素(包含 begin,但不包含 end)。
    • slice(1,4) 會提取原陣列中從第二個元素開始一直到第四個元素的所有元素 (索引為 1, 2, 3的元素)。
    • 如果該引數為負數, 則它表示在原陣列中的倒數第幾個元素結束抽取。 slice(-2,-1) 表示抽取了原陣列中的倒數第二個元素到最後一個元素(不包含最後一個元素,也就是隻有倒數第二個元素)。
    • 如果 end 被省略,則 slice 會一直提取到原陣列末尾。
    • 如果 end 大於陣列的長度,slice 也會一直提取到原陣列末尾。

splice()的引數
start 與 deleteCount 與 item1, item2, ..., itemx

引數 是否可選 描述
引數一 start 必選 指定修改的開始位置(從0計數)
引數二 deleteCount 可選 整數,表示要移除的陣列元素的個數。
引數三 item1, item2, ..., itemx 可選 要新增進陣列的元素,從start 位置開始。
  1. start

指定修改的開始位置(從0計數)。如果超出了陣列的長度,則從陣列末尾開始新增內容;如果是負值,則表示從陣列末位開始的第幾位(從-1計數,這意味著-n是倒數第n個元素並且等價於(array.length-n);如果負數的絕對值大於陣列的長度,則表示開始位置為第0位。

  1. deleteCount
    • 整數,表示要移除的陣列元素的個數。
    • 如果 deleteCount 大於 start 之後的元素的總數,則從 start 後面的元素都將被刪除(含第 start 位)。
    • 如果 deleteCount 被省略了,或者它的值大於等於array.length - start(也就是說,如果它大於或者等於start之後的所有元素的數量),那麼start之後陣列的所有元素都會被刪除。
    • 如果 deleteCount 是 0 或者負數,則不移除元素。這種情況下,至少應新增一個新元素。
  2. item1, item2, ..., itemx

要新增進陣列的元素,從start 位置開始。如果不指定,則 splice() 將只刪除陣列元素。

返回值:

返回值不同:

  • slice 一個含有被提取元素的新陣列。
  • splice 由被刪除的元素組成的一個陣列。如果只刪除了一個元素,則返回只包含一個元素的陣列。如果沒有刪除元素,則返回空陣列。

示例:

const Array = [
  { name: "孫悟空", age: 3 },
  { name: "豬八戒", age: 4 },
  { name: "沙和尚", age: 5 },
];

// 查詢陣列中 age 為 4 的值
const slice = Array.slice(0, 2);

// 查詢陣列中 age 為 4 元素的索引
const splice = Array.splice(0, 0, { name: "唐僧", age: 2 });

console.log(slice);
/*
  { name: "孫悟空", age: 3 },
  { name: "豬八戒", age: 4 },
*/

console.log(splice);  // 【】//向陣列中增加一個元素

console.log(Array);  //
/*
  { name: "唐僧", age: 2 }
  { name: "孫悟空", age: 3 },
  { name: "豬八戒", age: 4 },
  { name: "沙和尚", age: 5 },
*/

細節:

  • slice 如果向兩個陣列任一中新增了新元素,則另一個不會受到影響。

但如果是原陣列中有一是個物件引用(不是實際的物件)slice會拷貝這個物件引用到新的陣列裡,兩個物件引用是相同的,那麼被引用的物件改變,則新的和原陣列中的這個元素也會發生改變。

  • splice 如果新增進陣列的元素個數不等於被刪除的元素個數,陣列的長度會發生相應的改變。

方法列表

方法屬性:

方法 改變原陣列 返回值描述 描述
some() 布林值 檢查陣列。
every() 布林值 檢查陣列。
find() 所查詢到的值 查詢目標元素。
findindex() 所查詢到的值的索引值 查詢目標元素。
slice() 一個含有被提取元素的新陣列 刪除陣列元素。
splice() 被刪除的元素組成的一個陣列 刪除陣列元素。

相關文章