寫個方法判斷陣列物件中是否存在某個物件

王铁柱6發表於2024-12-04

有多種方法可以判斷陣列物件中是否存在某個物件,選擇哪種方法取決於你如何定義“存在”以及物件的複雜程度。

1. 使用 some() 方法 (推薦,適用於淺比較)

如果要判斷陣列中是否存在與目標物件 淺層相等 的物件,some() 方法是最簡潔高效的。淺層相等意味著比較的是物件的直接屬性值,而不是巢狀物件的屬性值。

function isObjectInArray(array, targetObject) {
  return array.some(object => {
    return Object.keys(object).every(key => object[key] === targetObject[key]);
  });
}


const myArray = [{ id: 1, name: 'Alice' }, { id: 2, name: 'Bob' }];

console.log(isObjectInArray(myArray, { id: 1, name: 'Alice' })); // true
console.log(isObjectInArray(myArray, { id: 3, name: 'Charlie' })); // false


// 對於包含巢狀物件的陣列,淺比較可能不夠:
const nestedArray = [{ id: 1, details: { city: 'New York' } }];
console.log(isObjectInArray(nestedArray, { id: 1, details: { city: 'New York' } })); // false (因為 details 物件不同)

2. 使用 findIndex() 方法 (適用於淺比較,並獲取索引)

some() 類似,findIndex() 也進行淺比較。不同之處在於,findIndex() 返回找到的物件的索引,如果找不到則返回 -1。

function findObjectIndex(array, targetObject) {
  return array.findIndex(object => {
    return Object.keys(object).every(key => object[key] === targetObject[key]);
  });
}

const myArray = [{ id: 1, name: 'Alice' }, { id: 2, name: 'Bob' }];

console.log(findObjectIndex(myArray, { id: 1, name: 'Alice' })); // 0
console.log(findObjectIndex(myArray, { id: 3, name: 'Charlie' })); // -1

3. 使用 JSON.stringify() (適用於深比較,但有侷限性)

如果需要進行 深層比較,可以將物件轉換為字串進行比較。但這種方法有一些侷限性,例如無法處理 Date 物件、函式等。

function isObjectInArrayDeep(array, targetObject) {
  const targetString = JSON.stringify(targetObject);
  return array.some(object => JSON.stringify(object) === targetString);
}

const nestedArray = [{ id: 1, details: { city: 'New York' } }];
console.log(isObjectInArrayDeep(nestedArray, { id: 1, details: { city: 'New York' } })); // true

4. 使用 Lodash 的 _.isEqual() (推薦,適用於深比較)

Lodash 的 _.isEqual() 方法可以進行深層比較,並且可以處理各種資料型別,包括 Date 物件、函式等。

import isEqual from 'lodash/isEqual'; // 需要安裝 lodash

function isObjectInArrayDeep(array, targetObject) {
  return array.some(object => isEqual(object, targetObject));
}

// ... (用法與之前的例子相同)

選擇哪種方法?

  • 對於簡單的物件,並且只需要判斷是否存在,使用 some() 方法。
  • 對於簡單的物件,並且需要獲取索引,使用 findIndex() 方法。
  • 對於複雜的巢狀物件,並且需要深層比較,推薦使用 Lodash 的 _.isEqual()
  • 避免使用 JSON.stringify(),除非你清楚它的侷限性並且可以接受。

記住根據你的具體需求選擇合適的方法。 希望這些資訊對你有幫助!

相關文章