首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >嵌套数据归一化createEntityAdapter

嵌套数据归一化createEntityAdapter
EN

Stack Overflow用户
提问于 2021-05-21 16:35:39
回答 2查看 634关注 0票数 1

我正试图规范化以下结构的数据数组( Array<Application> )。使用createEntityAdapter

在用createAsyncThunk获取数据并返回数据之后,我在extraReducers中设置了数据,如下所示:

代码语言:javascript
复制
applicationsAdapter.setAll(state, action.payload)

Redux DevTools中,我可以看到数据如下所示:

代码语言:javascript
复制
{
    applications: {
      ids: [
        '60a684fb90957536f185ea88',
      ],
      entities: {
        '60a684fb90957536f185ea88': {
          id: '60a684fb90957536f185ea88',
          title: 'Article1',
          description: 'The best article ever',
          groups: [
            {
              id: 'bPDGd8uOkmKKAO3FyoTKE',
              title: 'Group 1',
              voters: [
                {
                  user: {
                    uid: '344bc9b8-671b-4de5-ab2d-a619ea34d0ba',
                    username: 'tran',
                  },
                  vote: 'DECLINED'
                }
              ]
            }
          ],
          deadline: "2021-05-20",
          budget: 0,
          createdAt: '2021-05-20',
          createdBy: {
            uid: 'ab2a8f19-c851-4a5f-9438-1000bfde205a',
            username: 'admin',
          },
     },
}

问题:数据还没有完全规范化。我如何使团体、选民和用户对象正常化?

以下是接口:

代码语言:javascript
复制
export interface Application {
    id: string;
    title: string;
    description: string;
    groups: Array<GroupElement>;
    deadline: string;
    budget?: number;
    createdAt: string;
    createdBy: User;
}


export interface GroupElement {
    id: string;
    title: string;
    voters: Array<Voter>;
}

export interface User {
    uid: string;
    username: string;
}

export interface Voter {
    user: User;
    vote: Decision;
}
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2021-05-24 04:13:14

createEntityAdapter本身不执行任何类型的关系正常化。为此,您需要使用normalizr

由于Voter对象缺少自己的id属性,这是一个很难规范化的问题。我得把一个拼凑起来。

代码语言:javascript
复制
import { schema, normalize } from "normalizr";

const user = new schema.Entity("user", {}, { idAttribute: "uid" });

const voter = new schema.Entity(
  "voter",
  {
    user: user
  },
  {
    idAttribute: (object) => `${object.vote}-${object.user.uid}`
  }
);

const group = new schema.Entity("group", {
  voters: [voter]
});

const application = new schema.Entity("application", {
  createdBy: user,
  groups: [group]
});

normalize(entity, application);

将您的数据转换为:

代码语言:javascript
复制
{
  "entities": {
    "user": {
      "ab2a8f19-c851-4a5f-9438-1000bfde205a": {
        "uid": "ab2a8f19-c851-4a5f-9438-1000bfde205a",
        "username": "admin"
      },
      "344bc9b8-671b-4de5-ab2d-a619ea34d0ba": {
        "uid": "344bc9b8-671b-4de5-ab2d-a619ea34d0ba",
        "username": "tran"
      }
    },
    "voter": {
      "DECLINED-344bc9b8-671b-4de5-ab2d-a619ea34d0ba": {
        "user": "344bc9b8-671b-4de5-ab2d-a619ea34d0ba",
        "vote": "DECLINED"
      }
    },
    "group": {
      "bPDGd8uOkmKKAO3FyoTKE": {
        "id": "bPDGd8uOkmKKAO3FyoTKE",
        "title": "Group 1",
        "voters": ["DECLINED-344bc9b8-671b-4de5-ab2d-a619ea34d0ba"]
      }
    },
    "application": {
      "60a684fb90957536f185ea88": {
        "id": "60a684fb90957536f185ea88",
        "title": "Article1",
        "description": "The best article ever",
        "groups": ["bPDGd8uOkmKKAO3FyoTKE"],
        "deadline": "2021-05-20",
        "budget": 0,
        "createdAt": "2021-05-20",
        "createdBy": "ab2a8f19-c851-4a5f-9438-1000bfde205a"
      }
    }
  },
  "result": "60a684fb90957536f185ea88"
}
票数 1
EN

Stack Overflow用户

发布于 2021-10-12 16:32:05

赞成。createEntityAdapter似乎完成了第一层的规范化,因此输出了"ids /实体“。我不确定将它与正常化一起使用是否可行,因为createEntityAdapter的API公开了一些将数据放回其中的方法,比如addONe或addMany,如果您使用它与normalizr一起对嵌套的数据进行规范化,我认为您无法使用外部的方法,例如addOne或Add多个方法,用于您与库( normalizr )进行规范化的嵌套方法(Normalizr)。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/67640752

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档