反应,排序和对象数组(缩小和映射?)

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了反应,排序和对象数组(缩小和映射?)相关的知识,希望对你有一定的参考价值。

问题如下:(https://codesandbox.io/s/8p21n6p09l

我有一个对象数组(称为模块),看起来像这样:

const modules = [
  {
    thematicArea: "Topic 1",
    id: 1,
    name: "Budowanie postawy asertywnej",
    details: [
      "Czym jest asertywność?",
      "Asertywny Asertywny menedżer – charakterystyczne zachowania"
    ]
  },
  {
    thematicArea: "Topic 2",
    id: 2,
    name: "Asertywne narzędzia",
    details: [
      "Asertywna odmowa – zastosowanie trzyetapowej procedury",
      "Technika „Zdartej płyty”",
      "Wyrażanie pochwał i próśb"        ]
  },
  {
    thematicArea: "Topic 3",
    id: 3,
    name: "Lorem ipsum 1",
    details: ["Coś się wymyśli", "Żeby nie było tak łyso"]
  },
  {
    thematicArea: "Topic 3",
    id: 4,
    name: "Lorem ipsum 2",
    details: [
      "Wyczesane szkolenia",
      "Naprawdępowinieneś wrzucić to do koszyka",
      "Na co czekasz - dodaj!"
    ]
  },
  {
    thematicArea: "Topic 3",
    id: 5,
    name: "Ipsum Lorem",
    details: ["Och", "Ach"]
  },
  {
    thematicArea: "Topic 3",
    id: 6,
    name: "Ipsum Lorem 1",
    details: ["Och", "Ach"]
  },
  {
    thematicArea: "Topic 3",
    id: 7,
    name: "Ipsum Lorem 2",
    details: ["Och", "Ach"]
  },

并且此数组从App.js传递到thmaticArea.jsx组件。问题是我在显示数据时改变了主意,并希望通过thematicArea对它们进行分组,所以它看起来像:

Topic 1: 
 - Name 1
 - Name 2
 - Name 6
 - ...
Topic 2:
 - Name 3
 - Name 5
Topic 3:
- Name 4
and so on.

每个Name都是唯一的,只能有一个thematicArea(Topic),但是一个thematicArea(Topic)可以有多个名称(Name 1,Name 2 ...)。

我相信我应该首先使用reduce()方法然后使用.map(),但我已经尝试过多种方式,但它对我不起作用。 Reduce()方法正在创建一个没有长度的数组......这就是我尝试用App.js中的reduce实现它并将其作为'modules'传递给thematicArea.jsx组件的方法:

modules={this.state.modules.reduce(function(groups, item) {
              const val = item["thematicArea"];
              groups[val] = groups[val] || [];
              groups[val].push(item);
              return groups;
            }, [])}

达到预期结果的最佳方法是什么?

答案

你可以这样使用,最终输出应该是object而不是array

const modules = [{
        thematicArea: "Topic 1",
        id: 1,
        name: "Budowanie postawy asertywnej",
        details: [
            "Czym jest asertywność?",
            "Asertywny Asertywny menedżer – charakterystyczne zachowania"
        ]
    },
    {
        thematicArea: "Topic 2",
        id: 2,
        name: "Asertywne narzędzia",
        details: [
            "Asertywna odmowa – zastosowanie trzyetapowej procedury",
            "Technika „Zdartej płyty”",
            "Wyrażanie pochwał i próśb"
        ]
    },
    {
        thematicArea: "Topic 3",
        id: 3,
        name: "Lorem ipsum 1",
        details: ["Coś się wymyśli", "Żeby nie było tak łyso"]
    },
    {
        thematicArea: "Topic 3",
        id: 4,
        name: "Lorem ipsum 2",
        details: [
            "Wyczesane szkolenia",
            "Naprawdępowinieneś wrzucić to do koszyka",
            "Na co czekasz - dodaj!"
        ]
    },
    {
        thematicArea: "Topic 3",
        id: 5,
        name: "Ipsum Lorem",
        details: ["Och", "Ach"]
    },
    {
        thematicArea: "Topic 3",
        id: 6,
        name: "Ipsum Lorem 1",
        details: ["Och", "Ach"]
    },
    {
        thematicArea: "Topic 3",
        id: 7,
        name: "Ipsum Lorem 2",
        details: ["Och", "Ach"]
    }
];



let result = modules.reduce((obj, val) => {
    obj[val.thematicArea] = obj[val.thematicArea] || [];
    if (obj[val.thematicArea].indexOf(val.name) == -1)
        obj[val.thematicArea].push(val.name);
    return obj;
}, {});


console.log(result);

以上是关于反应,排序和对象数组(缩小和映射?)的主要内容,如果未能解决你的问题,请参考以下文章

反应:映射嵌套的对象数组

如何在反应中显示表格中的对象数组

在反应中映射对象键并返回子属性

如何在反应中从对象映射动态设置 sessionStorage

如何在反应中从数组中映射出预加载的图像?

错误代码:错误域 = NSCocoaErrorDomain 代码 = 3840“JSON 文本没有以数组或对象和允许未设置片段的选项开头。”