」工欲善其事,必先利其器。「—孔子《論語.錄靈公》
首頁 > 程式設計 > 如何在 JavaScript 中以多個屬性和聚合值對物件進行分組?

如何在 JavaScript 中以多個屬性和聚合值對物件進行分組?

發佈於2024-12-25
瀏覽:817

How to Group Objects by Multiple Properties and Aggregate Values in JavaScript?

以多個屬性將物件分組並聚合值

在以多個屬性將物件分組並聚合值

在以多個屬性將陣列中的物件分組的任務中,一個常見的要求是不僅可以依這些屬性分組,還可以對某些物件屬性的值進行求和。然而,簡單地將所有重複項嵌套在二維數組中的解決方案是不夠的。

問題陳述

考慮一個必須按形狀分組的物件數組,並且顏色。只有當該數組中的物件的形狀和顏色相同時,才會將其視為重複物件。對於重複的對象,我們需要總結它們的使用值和實例值,並刪除重複項,從而得到具有獨特形狀和顏色的簡潔對象清單。

解決方案

const arr = [
  { shape: 'square', color: 'red', used: 1, instances: 1 },
  { shape: 'square', color: 'red', used: 2, instances: 1 },
  { shape: 'circle', color: 'blue', used: 0, instances: 0 },
  { shape: 'square', color: 'blue', used: 4, instances: 4 },
  { shape: 'circle', color: 'red', used: 1, instances: 1 },
  { shape: 'circle', color: 'red', used: 1, instances: 0 },
  { shape: 'square', color: 'blue', used: 4, instances: 5 },
  { shape: 'square', color: 'red', used: 2, instances: 1 },
];

const helper = {};
const result = arr.reduce((r, o) => {
  const key = `${o.shape}-${o.color}`;

  if (!helper[key]) {
    // If it's a unique combination, add to the helper and result array
    helper[key] = Object.assign({}, o);
    r.push(helper[key]);
  } else {
    // If it's a duplicate, update the values in the helper
    helper[key].used  = o.used;
    helper[key].instances  = o.instances;
  }

  return r;
}, []);

console.log(result);

解決方案

為了有效解決這個問題,我們可以結合使用Array#reduce 方法和一個跟踪遇到的形狀和顏色組合的輔助對象:
const arr = [
  { shape: 'square', color: 'red', used: 1, instances: 1 },
  { shape: 'square', color: 'red', used: 2, instances: 1 },
  { shape: 'circle', color: 'blue', used: 0, instances: 0 },
  { shape: 'square', color: 'blue', used: 4, instances: 4 },
  { shape: 'circle', color: 'red', used: 1, instances: 1 },
  { shape: 'circle', color: 'red', used: 1, instances: 0 },
  { shape: 'square', color: 'blue', used: 4, instances: 5 },
  { shape: 'square', color: 'red', used: 2, instances: 1 },
];

const helper = {};
const result = arr.reduce((r, o) => {
  const key = `${o.shape}-${o.color}`;

  if (!helper[key]) {
    // If it's a unique combination, add to the helper and result array
    helper[key] = Object.assign({}, o);
    r.push(helper[key]);
  } else {
    // If it's a duplicate, update the values in the helper
    helper[key].used  = o.used;
    helper[key].instances  = o.instances;
  }

  return r;
}, []);

console.log(result);
const arr = [ { 形狀:'方形',顏色:'紅色',已使用:1,實例:1 }, { 形狀:'正方形',顏色:'紅色',已使用:2,實例:1 }, { 形狀:'圓形',顏色:'藍色',已使用:0,實例:0 }, { 形狀:'正方形',顏色:'藍色',已使用:4,實例:4 }, { 形狀:'圓形',顏色:'紅色',已使用:1,實例:1 }, { 形狀:'圓形',顏色:'紅色',已使用:1,實例:0 }, { 形狀:'正方形',顏色:'藍色',已使用:4,實例:5 }, { 形狀:'正方形',顏色:'紅色',已使用:2,實例:1 }, ]; 常量助手 = {}; const 結果 = arr.reduce((r, o) => { const key = `${o.shape}-${o.color}`; if (!helper[key]) { // 如果是唯一組合,則加入到 helper 和 result 陣列中 helper[key] = Object.assign({}, o); r.push(helper[key]); } 別的 { // 如果重複,則更新助手中的值 helper[key].used = o.used; helper[key].instances = o.instances; } 返回 r; }, []); console.log(結果);

輸出:How to Group Objects by Multiple Properties and Aggregate Values in JavaScript?

[ { 形狀:“正方形”,顏色:“紅色”,已使用:5,實例:3 }, { 形狀:“圓形”,顏色:“紅色”,使用次數:2,實例:1 }, { 形狀:“方形”,顏色:“藍色”,已使用:11,實例:9 }, { 形狀:“圓形”,顏色:“藍色”,已使用:0,實例:0 } ]此解決方案按形狀和顏色對物件進行有效分組,聚合重複物件的使用值和實例值,並刪除任何剩餘的重複項,從而產生所需的輸出。

最新教學 更多>
  • 插入資料時如何修復「常規錯誤:2006 MySQL 伺服器已消失」?
    插入資料時如何修復「常規錯誤:2006 MySQL 伺服器已消失」?
    插入記錄時如何解決「一般錯誤:2006 MySQL 伺服器已消失」介紹:將資料插入MySQL 資料庫有時會導致錯誤「一般錯誤:2006 MySQL 伺服器已消失」。當與伺服器的連線遺失時會出現此錯誤,通常是由於 MySQL 配置中的兩個變數之一所致。 解決方案:解決此錯誤的關鍵是調整wait_tim...
    程式設計 發佈於2024-12-26
  • 在 Go 中使用 WebSocket 進行即時通信
    在 Go 中使用 WebSocket 進行即時通信
    构建需要实时更新的应用程序(例如聊天应用程序、实时通知或协作工具)需要比传统 HTTP 更快、更具交互性的通信方法。这就是 WebSockets 发挥作用的地方!今天,我们将探讨如何在 Go 中使用 WebSocket,以便您可以向应用程序添加实时功能。 在这篇文章中,我们将介绍: WebSocke...
    程式設計 發佈於2024-12-26
  • 如何在單一頁面上使用多個 jQuery 版本而不發生衝突?
    如何在單一頁面上使用多個 jQuery 版本而不發生衝突?
    單頁上的多個jQuery 版本將依賴jQuery 的小部件整合到客戶的網頁中時,如果它們是已經使用過時的jQuery 版本。確保相容性,同時避免干擾現有程式碼變得至關重要。 幸運的是,jQuery 透過其 noConflict 模式提供了解決方案。這允許您載入多個版本的庫而不會發生衝突。 程式碼實作...
    程式設計 發佈於2024-12-26
  • HTML 格式標籤
    HTML 格式標籤
    HTML 格式化元素 **HTML Formatting is a process of formatting text for better look and feel. HTML provides us ability to format text without us...
    程式設計 發佈於2024-12-26
  • Pandas 中的 For 迴圈總是低效嗎?  什麼時候應該優先考慮迭代而不是向量化?
    Pandas 中的 For 迴圈總是低效嗎? 什麼時候應該優先考慮迭代而不是向量化?
    pandas 中的 for 迴圈真的很糟糕嗎?我什麼時候該關心? 簡介雖然 pandas 以其可加速計算的向量化運算而聞名,但許多程式碼範例仍包含循環。雖然文件建議避免對資料進行迭代,但本文探討了 for 迴圈比向量化方法提供更好效能的場景。 小數據上的迭代與向量化For對於小數據,for 循環的性...
    程式設計 發佈於2024-12-26
  • 如何在 PHP 中組合兩個關聯數組,同時保留唯一 ID 並處理重複名稱?
    如何在 PHP 中組合兩個關聯數組,同時保留唯一 ID 並處理重複名稱?
    在 PHP 中組合關聯數組在 PHP 中,將兩個關聯數組組合成一個數組是常見任務。考慮以下請求:問題描述:提供的代碼定義了兩個關聯數組,$array1和$array2。目標是建立一個新陣列 $array3,它合併兩個陣列中的所有鍵值對。 此外,提供的陣列具有唯一的 ID,而名稱可能重疊。要求是建構一...
    程式設計 發佈於2024-12-26
  • CSS 中的偶數與奇數列表項樣式:`li:odd`/`:even` 或 `:nth-child()`?
    CSS 中的偶數與奇數列表項樣式:`li:odd`/`:even` 或 `:nth-child()`?
    偶數與奇數列表元素的樣式:偽類與第n 個子元素當嘗試使用CSS 偽類實現列表項的交替顏色時,您可以遇到問題。雖然為此目的使用 li:odd 和 li:even 似乎合乎邏輯,但其行為可能是不可預測的。 要有效地設定列表項目的偶數和奇數實例的樣式,請考慮使用以下方法: 而不是:li { color: ...
    程式設計 發佈於2024-12-26
  • 儘管程式碼有效,為什麼 POST 請求無法擷取 PHP 中的輸入?
    儘管程式碼有效,為什麼 POST 請求無法擷取 PHP 中的輸入?
    解決PHP 中的POST 請求故障在提供的程式碼片段中:action=''而非:action="<?php echo $_SERVER['PHP_SELF'];?>";?>"檢查$_POST陣列:表單提交後使用 var_dump 檢查 $_POST 陣列的內...
    程式設計 發佈於2024-12-26
  • 大批
    大批
    方法是可以在物件上呼叫的 fns 數組是對象,因此它們在 JS 中也有方法。 slice(begin):將陣列的一部分提取到新數組中,而不改變原始數組。 let arr = ['a','b','c','d','e']; // Usecase: Extract till index ...
    程式設計 發佈於2024-12-26
  • Bootstrap 4 Beta 中的列偏移發生了什麼事?
    Bootstrap 4 Beta 中的列偏移發生了什麼事?
    Bootstrap 4 Beta:列偏移的刪除和恢復Bootstrap 4 在其Beta 1 版本中引入了重大更改柱子偏移了。然而,隨著 Beta 2 的後續發布,這些變化已經逆轉。 從 offset-md-* 到 ml-auto在 Bootstrap 4 Beta 1 中, offset-md-*...
    程式設計 發佈於2024-12-26
  • 如何在 HTML 表格中有效地使用 Calc() 和基於百分比的欄位?
    如何在 HTML 表格中有效地使用 Calc() 和基於百分比的欄位?
    在表格中使用Calc():克服百分比困境創建具有固定寬度列和可變寬度列的表格可能具有挑戰性,尤其是在嘗試在其中使用calc() 函數。 在 HTML 中,使用 px 或 em 設定固定列寬非常簡單。但是,對於可變寬度列,通常使用百分比 (%) 單位。然而,當在表中使用 calc() 時,百分比似乎無...
    程式設計 發佈於2024-12-26
  • 如何在PHP中透過POST提交和處理多維數組?
    如何在PHP中透過POST提交和處理多維數組?
    在PHP 中透過POST 提交多維數組當使用具有可變長度的多列和行的PHP 表單時,有必要進行轉換輸入到多維數組中。這是解決這項挑戰的方法。 首先,為每列分配唯一的名稱,例如:<input name="topdiameter[' current ']" type="...
    程式設計 發佈於2024-12-26
  • for(;;) 迴圈到底是什麼、它是如何運作的?
    for(;;) 迴圈到底是什麼、它是如何運作的?
    揭秘神秘的for(;;) 循環在古老的程式碼庫深處,你偶然發現了一個令人困惑的奇特for 循環你的理解。其顯示如下:for (;;) { //Some stuff }您深入研究線上資源,但發現自己陷入沉默。讓我們來剖析這個神秘的構造。 for 迴圈的結構Java 中的for 迴圈遵循特定的語...
    程式設計 發佈於2024-12-25
  • Java 的 Scanner.useDelimiter() 如何使用正規表示式?
    Java 的 Scanner.useDelimiter() 如何使用正規表示式?
    Java 使用Scanner.useDelimiter 了解分隔符號Java 中使用Scanner.useDelimiter 了解分隔符號Java 中的Scanner 類別提供了useDelimiter 方法,讓您指定分隔符號(代字或模式)來分隔代字幣。然而,使用分隔符號可能會讓初學者感到困惑。讓我...
    程式設計 發佈於2024-12-25
  • 如何在 Android 中顯示動畫 GIF?
    如何在 Android 中顯示動畫 GIF?
    在Android 中顯示動畫GIF儘管最初誤解Android 不支援動畫GIF,但實際上它具有解碼和顯示動畫的能力顯示它們。這是透過利用 android.graphics.Movie 類別來實現的,儘管這方面沒有廣泛記錄。 要分解動畫 GIF 並將每個幀作為可繪製對象合併到 AnimationDra...
    程式設計 發佈於2024-12-25

免責聲明: 提供的所有資源部分來自互聯網,如果有侵犯您的版權或其他權益,請說明詳細緣由並提供版權或權益證明然後發到郵箱:[email protected] 我們會在第一時間內為您處理。

Copyright© 2022 湘ICP备2022001581号-3