JavaScript - 如何将具有匹配ID的对象添加到数组中

3

我有一个数组categories,其中包含我试图与我的数组articles匹配的值id.

如果articles中有一个与categories之一的匹配id,我想将它们合并成一个数组。我能够将这些对象添加到数组中,但它们不是基于id进行匹配的。

以下是categories的示例:

const categories = [{results: 
    { 
      "id": 28,
      "name": "Articles"
    }, { 
      "id": 76,
      "name": "Projects"
    }
    }]

这里是一篇文章的示例:

const articles = [ 
{
 "title": "first article",
 "content": "lorem ipsum",
 "categoryId": 28
},
{
 "title": "second article",
 "content": "lorem ipsum",
 "categoryId": 28
},
{
 "title": "thirdarticle",
 "content": "lorem ipsum",
 "categoryId": 76
},
]

我试图将这两个数组合并成一个。如果可能的话,我希望articles数组是匹配索引的数组。例如:
 const combined = [
      {
        "id": 28,
        "name": "Articles",
        "articles:: [
          { "title": "first article", "content": "lorem ipsum", "categoryId": 28 },
          { "title": "second article", "content": "lorem ipsum", "categoryId": 28 },
        ],
      },
    ];

我试图通过对类别进行映射并使用 Object.assign 来实现这一点。输出结果似乎是将数组组合在一起,但我认为它们都被组合在一起而不是匹配id。

我该如何实现这个?

const articles = [ 
    {
     "title": "first article",
     "content": "lorem ipsum",
     "categoryId": 28
    },
    {
     "title": "second article",
     "content": "lorem ipsum",
     "categoryId": 28
    },
    {
     "title": "thirdarticle",
     "content": "lorem ipsum",
     "categoryId": 76
    },
    ]
    

const categories = {results: [{ "id": 28, "name": "Articles"}, {"id": 76, "name": "Projects"}]}

let combined = categories.results.map((item, i ) => Object.assign(item, articles));

  console.log(combined)


你没有在任何地方寻找匹配的ID。 - Barmar
提示:使用 find() 方法查找具有给定属性值的对象。 - Barmar
您最初提供的 categories 示例并不是有效的 JavaScript。它应该是一个包含数组的对象,但实际上它是一个包含无效对象的数组。 - Barmar
1个回答

7

这是使用您的代码获取结果并过滤匹配文章,然后使用 spread 操作符的一种方式来到达那里。

let combined = categories.results.map(item => ({ ...item,
  articles: articles.filter(f => f.categoryId == item.id)
}));

const articles = [{
    "title": "first article",
    "content": "lorem ipsum",
    "categoryId": 28
  },
  {
    "title": "second article",
    "content": "lorem ipsum",
    "categoryId": 28
  },
  {
    "title": "thirdarticle",
    "content": "lorem ipsum",
    "categoryId": 76
  },
]


const categories = {
  results: [{
    "id": 28,
    "name": "Articles"
  }, {
    "id": 76,
    "name": "Projects"
  }]
}

let combined = categories.results.map(item => ({ ...item,
  articles: articles.filter(f => f.categoryId == item.id)
}));

console.log(combined)


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接