在 Javascript 中使用键对对象数组进行分组

ari*_*ies 0 javascript arrays object

有谁知道 Vanilla Javascript 中的一种方法可以根据对象键对对象数组进行分组,然后根据分组创建新的对象数组?还在元素内对元素进行分组。我希望通过一个例子来阐明这一点。我有各种各样的水果

fruits: [
    {
      id: "645",
      lang: "it",
      name: "Banana",
    },
    {
      id: "3671",
      lang: "it",
      name: "Pesca",
    },
    {
      id: "3671",
      lang: "en",
      name: "Peach",
    },
    {
      id: "124",
      lang: "it",
      name: "Anguria",
    },
    {
      id: "124",
      lang: "en",
      name: "Watermelon",
    },
  ]
Run Code Online (Sandbox Code Playgroud)

我希望输出是这样的

fruitsGroupedById: [
    {
      id: "645",
      language: [
        {
          lang: "it",
          name: "Banana",
        },
      ],
    },
    {
      id: "3671",
      language: [
        {
          lang: "it",
          name: "Pesca",
        },
        {
          lang: "en",
          name: "Peach",
        },
      ],
    },
    {
      id: "124",
      language: [
        {
          lang: "it",
          name: "Anguria",
        },
        {
          lang: "en",
          name: "Watermelon",
        },
      ],
    },
  ]
Run Code Online (Sandbox Code Playgroud)

Dan*_*iel 5

为了简单起见,我会分两步完成

\n
    \n
  • 创建一个以 id 为键的对象,并用数据填充它
  • \n
  • 然后将对象转换为数组
  • \n
\n

例子:

\n

\r\n
\r\n
const fruits = [\n  { id: "645", lang: "it", name: "Banana" },\n  { id: "3671", lang: "it", name: "Pesca" },\n  { id: "3671", lang: "en", name: "Peach" },\n  { id: "124", lang: "it", name: "Anguria" },\n  { id: "124", lang: "en", name: "Watermelon" },\n];\n\nconst o = {};\n\nfruits.forEach((f) => {\n  if (!o[f.id]) {\n    // create object if id is not recognized\n    o[f.id] = { id: f.id, language: [] };\n  }\n  // add language\n  o[f.id].language.push({ lang: f.lang, name: f.name });\n});\n\n// get array without the key\nconst arr = Object.values(o);\n\nconsole.log(arr);
Run Code Online (Sandbox Code Playgroud)\r\n
\r\n
\r\n

\n


\n

更新

\n

这是一个使用它根据name时间进行排序的示例lang"it"

\n

\r\n
\r\n
const fruits = [\n  { id: "645", lang: "it", name: "Banana" },\n  { id: "3671", lang: "it", name: "Pesca" },\n  { id: "3671", lang: "en", name: "Peach" },\n  { id: "124", lang: "it", name: "Anguria" },\n  { id: "124", lang: "en", name: "Watermelon" },\n];\n\nconst o = {};\n\nfruits.forEach((f) => {\n  if (!o[f.id]) {\n    // create object if id is not recognized\n    o[f.id] = { id: f.id, language: [], $sort: "\xee\xa0\xba" };\n  }\n  // add language\n  o[f.id].language.push({ lang: f.lang, name: f.name });\n\n  // custom sort\n  if (f.lang === "it") {\n    o[f.id].$sort = f.name;\n  }\n});\n\n// get array without the key\nconst arr = Object.values(o).sort((a, b) => a.$sort - b.$sort);\n\nconsole.log(arr);
Run Code Online (Sandbox Code Playgroud)\r\n
\r\n
\r\n

\n

这里有一个小技巧,$sort: "\xee\xa0\xba"默认的$sortto\xee\xa0\xba被称为私人使用字符,并将其自身设置为最后一个字母(在 后面z或什至\xc5\xbe),这将使没有意大利名称的项目出现在最后。此示例$sort在结果中包含我故意留在那里的 ,但您可以将其删除。

\n

示例map

\n
const arr = Object.values(o)\n  .sort((a, b) => a.$sort - b.$sort)\n  .map(i => ({\n    id: i.id,\n    language: i.language\n  })\n
Run Code Online (Sandbox Code Playgroud)\n