簡體   English   中英

如何使用和不使用Lodash通過多個鍵對對象數組進行分組?

[英]How to group array of objects by multiple keys with and without Lodash?

export default [
  {
    id: 101,
    league: {
      id: "500",
      name: "EU Champions League"
    },
    group: {
      id: "990",
      name: "Group A"
    }
  },
  {
    id: 102,
    league: {
      id: 600,
      name: "Super Lig"
    }
  },
  {
    id: 103,
    league: {
      id: 500,
      name: "EU Champions League"
    }
  },
  {
    id: 104,
    league: {
      id: 500,
      name: "EU Champions League"
    }
  },
  {
    id: 105,
    league: {
      id: 500,
      name: "EU Champions League"
    },
    group: {
      id: "991",
      name: "Group B"
    }
  },
  {
    id: 106,
    league: {
      id: 500,
      name: "EU Champions League"
    },
    group: {
      id: "991",
      name: "Group B"
    }
  }
];

這是一個現場演示,但與我期望的相差甚遠,可以參考以確定我正在嘗試做什么並且顯然失敗了!

https://codesandbox.io/s/js-group-array-of-object-by-multiple-keys-8b4s0

對象數組如下所示;

  • 歐洲冠軍聯賽 - A組
  • 超級聯賽
  • 歐洲冠軍聯賽
  • 歐洲冠軍聯賽
  • 歐洲冠軍聯賽 - B 組
  • 歐洲冠軍聯賽 - B 組

我想要做的是將具有相同聯賽 ID 的和具有相同聯賽 ID + 組名的組分組,將其作為對象輸出,其中對象鍵是“聯賽 ID + 組 ID”(需要時); 所以它變成了這樣;

{
      // All objects with league id 500 and group A
      '500-990': [{
        id: 101,
        league: {
          id: "500",
          name: "EU Champions League"
        },
        group: {
          id: "990",
          name: "Group A"
        }
      }],
      // All objects with league id 600
      '600': [{
        id: 102,
        league: {
          id: 600,
          name: "Super Lig"
        }
      }],
      // All objects with league id 500 only with NO groups
      '500': [{
        id: 103,
        league: {
          id: 500,
          name: "EU Champions League"
        }
      },
      {
        id: 104,
        league: {
          id: 500,
          name: "EU Champions League"
        }
      }],
      // All objects with league id 500 and group B
      '500-991': [{
        id: 105,
        league: {
          id: 500,
          name: "EU Champions League"
        },
        group: {
          id: "991",
          name: "Group B"
        }
      },
      {
        id: 106,
        league: {
          id: 500,
          name: "EU Champions League"
        },
        group: {
          id: "991",
          name: "Group B"
        }
      }],
}

基本上根據組是否存在創建密鑰,如果存在,則將組字母添加到末尾並創建數組。

 const groupById = (arr) => { let resp = {}; for (const val of arr) { const key = val.group ? val.league.id + '-' + val.group.name.slice(-1).toLowerCase() : val.league.id; if (!resp[key]) { resp[key] = [val]; } resp[key].push(val); } return resp; } const input = [{ id: 101, league: { id: "500", name: "EU Champions League" }, group: { id: "990", name: "Group A" } }, { id: 102, league: { id: 600, name: "Super Lig" } }, { id: 103, league: { id: 500, name: "EU Champions League" } }, { id: 104, league: { id: 500, name: "EU Champions League" } }, { id: 105, league: { id: 500, name: "EU Champions League" }, group: { id: "991", name: "Group B" } }, { id: 106, league: { id: 500, name: "EU Champions League" }, group: { id: "992", name: "Group B" } }]; console.log(groupById(input));

如有必要,您可以使用組合鍵並按此值分組。

 const data = [{ id: 101, league: { id: "500", name: "EU Champions League" }, group: { id: "990", name: "Group A" } }, { id: 102, league: { id: 600, name: "Super Lig" } }, { id: 103, league: { id: 500, name: "EU Champions League" } }, { id: 104, league: { id: 500, name: "EU Champions League" } }, { id: 105, league: { id: 500, name: "EU Champions League" }, group: { id: "991", name: "Group B" } }, { id: 106, league: { id: 500, name: "EU Champions League" }, group: { id: "992", name: "Group B" } }], result = data.reduce((r, o) => { const key = o.group ? [o.id, o.group.name].join('-') : o.id; (r[key] ??= []).push(o); return r; }, {}); console.log(result);
 .as-console-wrapper { max-height: 100% !important; top: 0; }

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM