如何在 JavaScript 中過濾物件

Moataz Farid 2023年1月30日 2020年11月24日
  1. 在 JavaScript 中使用 reduce 來過濾物件
  2. 使用 map 函式過濾 JavaScript 物件
如何在 JavaScript 中過濾物件

本教程將介紹如何在 JavaScript 中過濾一個物件。我們將學習如何在 JavaScript 中實現類似於陣列資料型別中的 Objectfilter 方法。

在 JavaScript 中使用 reduce 來過濾物件

現在讓我們用 reduce 函式實現過濾物件的功能。

假設我們有以下物件。

var grades = {
    linearAlgebra : 90,
    chemistry : 95
    biology :90
    languages : 96
}

上面的物件代表了一個學生的成績,我們需要過濾這個物件,只得到 95 分以上的科目。

var grades = {
    linearAlgebra : 90,
    chemistry : 95,
    biology :90,
    languages : 96
 };

Object.filter = function(mainObject, filterFunction){
    return Object.keys(mainObject)
          .filter( function(ObjectKey){
              return filterFunction(mainObject[ObjectKey])
          } )
          .reduce( function (result, ObjectKey){
              result[ObjectKey] = mainObject[ObjectKey];
              return result;
            }, {} );
}

console.log("The grades are ",grades);

var targetSubjects = Object.filter(grades, function(grade){
    return grade>=95;
});

console.log("Target Subjects are ",targetSubjects);

輸出:

"The grades are ", {
  biology: 90,
  chemistry: 95,
  languages: 96,
  linearAlgebra: 90
}
"Target Subjects are ", {
  chemistry: 95,
  languages: 96
}

在上面的例子中,我們將 Object.filter 函式實現為 Object.filter = function(mainObject, filterFunction)。我們可以將該示例程式碼簡化如下。

Object.filter = function(mainObject, filterFunction){
    return Object.keys(mainObject)
          .filter(innerFilterFunction )
          .reduce(reduceFunction, {} );
}

它主要有 3 個步驟來實現那個 Object.filter 函式。

  1. Object.keys() 從物件中的 key-value 對中返回一個鍵陣列。在我們的例子中是 linearAlgebra、化學、生物、語言
    Object.keys() 的結果被髮送到回撥函式 innerFilterFunction,該函式也是過濾器 function 的一個引數,該 innerFilterFunction 函式的輸出將是過濾後的鍵值。在我們的例子中,輸出的是化學、語言
  2. 過濾的結果現在傳遞給我們的 reduce() 函式,它將每個值加到它的鍵上,並返回一個包含所有這些對的新物件。因此,我們例子中的結果是 {chemistry: 95, languages: 96}.

如果我們想用 ES6 的 箭頭 語法重新建立上面的例子,我們可以把它改寫成如下。

var grades = {
    linearAlgebra : 90,
    chemistry : 95,
    biology :90,
    languages : 96
 };

Object.filter = (mainObject, filterFunction)=>
    Object.keys(mainObject)
          .filter( (ObjectKey)=>filterFunction(mainObject[ObjectKey]))
          .reduce( (result, ObjectKey)=> ( result[ObjectKey] = mainObject[ObjectKey], result ), {} );

console.log("The grades are ",grades);

var targetSubjects = Object.filter(grades, (grade)=> grade>=95 );

console.log("Target Subjects are ",targetSubjects);

輸出:

The grades are  {linearAlgebra: 90, chemistry: 95, biology: 90, languages: 96}
Target Subjects are  {chemistry: 95, languages: 96}

它使用 逗號 操作符來返回 result 物件,也可以用 Object.assign 代替,它也會返回結果。所以程式碼可以改寫如下。

Object.filter = (mainObject, filterFunction)=>
          Object.keys(mainObject)
          .filter( (ObjectKey)=>filterFunction(mainObject[ObjectKey]))
          .reduce( (result, ObjectKey)=> Object.assign(result , {[ObjectKey]: mainObject[ObjectKey] } ), {} );

使用 map 函式過濾 JavaScript 物件

由於我們在上面的解決方案中使用了 reduce 函式,所以我們也可以使用 map 函式來過濾 JavaScript 物件。

Object.filter = function(mainObject, filterFunction){
    return Object.assign(...Object.keys(mainObject)
          .filter( function(ObjectKey){
              return filterFunction(mainObject[ObjectKey])
          } )
          .map( function (ObjectKey){
              return {[ObjectKey]: mainObject[ObjectKey]};
          }) );
}

我們用如上圖所示的 map 函式替換了 reduce 函式,同時使用了 Object.assign,並使用 spread 語法將從 Object.keys().map() 開始的所有操作都傳送給它,所以現在完整的實現應該是下面這樣的。

var grades = {
    linearAlgebra : 90,
    chemistry : 95,
    biology :90,
    languages : 96
 };

Object.filter = function(mainObject, filterFunction){
    return Object.assign(...Object.keys(mainObject)
          .filter( function(ObjectKey){
              return filterFunction(mainObject[ObjectKey])
          } )
          .map( function (ObjectKey){
              return {[ObjectKey]: mainObject[ObjectKey]};
          }) );
}

console.log("The grades are ",grades);

var targetSubjects = Object.filter(grades, (grade)=> grade>=95 );

console.log("Target Subjects are ",targetSubjects);

輸出:

The grades are  {linearAlgebra: 90, chemistry: 95, biology: 90, languages: 96}
Target Subjects are  {chemistry: 95, languages: 96}

相關文章 - JavaScript Filter

相關文章 - JavaScript Object