如何在reactjs/javascript中按值对对象数组进行分组

bob*_*n56 2 javascript foreach loops group-by reactjs

我有一个具有不同值的对象数组

 items=[{id:1,category:"cat_1" , title:"My title 1"},{id:2,category:"cat_2" , title:"My title 2"},{id:6,category:"cat_1" , title:"Another title 1"},{id:1,category:"cat_3" , title:"My title 3"},{id:8,category:"cat_1" , title:"Third Title"},{id:2,category:"cat_2" , title:"Another title 2 "}]
Run Code Online (Sandbox Code Playgroud)

我使用数组映射列出对象并将其显示为

     {
     items.map((item) => (
        <h1>{item.category}</h1>
        <p>{item.title}</p>
    ))} 
Run Code Online (Sandbox Code Playgroud)

我的问题是如何迭代项目,以便按类别对项目进行分组,如下所示

cat_1
- My title 1
- Another title 1
- My title 3

cat_2
- My title 2
- Another title 2

cat_3
-Third Title
Run Code Online (Sandbox Code Playgroud)

Cer*_*nce 10

用途.reduce:

const items = [{
  id: 1,
  category: "cat_1",
  title: "My title 1"
}, {
  id: 2,
  category: "cat_2",
  title: "My title 2"
}, {
  id: 6,
  category: "cat_1",
  title: "Another title 1"
}, {
  id: 1,
  category: "cat_3",
  title: "My title 3"
}, {
  id: 8,
  category: "cat_1",
  title: "Third Title"
}, {
  id: 2,
  category: "cat_2",
  title: "Another title 2 "
}];
const cats = items.reduce((catsSoFar, { category, title }) => {
  if (!catsSoFar[category]) catsSoFar[category] = [];
  catsSoFar[category].push(title);
  return catsSoFar;
}, {});
console.log(cats);
Run Code Online (Sandbox Code Playgroud)

  • @TerryLennox:这是轻描淡写!事实上,`reduce` 是一个通用的迭代操作,*你可以用 `FOREACH` 循环(`for`/`in`、`for`/`of`、`Array.prototype.forEach`)做的所有事情,你可以用`reduce`来做!一旦有了 `reduce`,你就不再需要 `map`、`filter`、`groupBy`、`sort` 等(当然,可读性和清晰度除外)。['fold` 的维基百科页面](https://en.wikipedia.org/wiki/Fold_(higher-order_function)#Universality) 上有一个简单的证明草图。所以,`reduce` 不仅仅是“超级强大”,它实际上是“全能”。 (2认同)
  • @JörgWMittag,但你可以对 `forEach` 甚至简单的 `for` 和 `map` 说同样的话——重要的部分不是使用足够强大的东西(http://qr.ae/RNMEGA),而是使用足够强大的东西 * 并且 * 在语义上适合它的效果。 (2认同)

Aar*_*ery 5

我在很多项目中使用 lodash 作为通用实用带。如果你决定做类似的事情——那就很简单:

\n\n

\r\n
\r\n
const data = [{\r\n  id: 1,\r\n  category: "cat_1",\r\n  title: "My title 1"\r\n}, {\r\n  id: 2,\r\n  category: "cat_2",\r\n  title: "My title 2"\r\n}, {\r\n  id: 6,\r\n  category: "cat_1",\r\n  title: "Another title 1"\r\n}, {\r\n  id: 1,\r\n  category: "cat_3",\r\n  title: "My title 3"\r\n}, {\r\n  id: 8,\r\n  category: "cat_1",\r\n  title: "Third Title"\r\n}, {\r\n  id: 2,\r\n  category: "cat_2",\r\n  title: "Another title 2 "\r\n}];\r\n\r\nconst groups = _.groupBy(data, \xc2\xa0\'category\');\r\n\r\nconsole.log(groups);
Run Code Online (Sandbox Code Playgroud)\r\n
<script src="https://cdn.jsdelivr.net/npm/lodash@4.17.5/lodash.min.js"></script>
Run Code Online (Sandbox Code Playgroud)\r\n
\r\n
\r\n

\n