首页 > 解决方案 > 为 Normalizr 实体使用两个 id 键属性的最佳方法

问题描述

考虑一个模型公司,其 id 和 slug 字段都是唯一的。- 公司 slug 将在其个人资料页面中使用,slug 被解析以从该州检索公司数据。- 公司 id 在其他模型中记录为外键(假设是用户),用户的公司数据将通过其 id 获取。

现在,查看我的架构,我定义了一个 Company 实体,如下所示:

const options = {idAttribute: value => value.id};
const company = new schema.Entity("companies", undefined, options);

这都是通过 id 来查询公司的,但是如果我想在访问https://example.com/company/company-slug/时检索当前公司,那么我需要使用 lodash 过滤我的主机实体,如下所示

_.find(state.entities.companies, company => company.slug === "company-slug")

这并不理想。

什么是更好的方法?在状态中保留 slug → id 的地图?

entities
    companies
       1: {slug: "a", ...}
       2: {slug: "b", ...}
       ...
    allIds: [1, 2, ...]
    slugsMap:
        a: 1
        b: 2

然后我就可以在我的选择器中找到我的公司,如下所示

const companies = state.entities.companies;
const companyId = companies.slugsMap["company-slug"];
const company = companies[companyId];

期待您能想出的出色解决方案!

编辑:在阅读了 JavaScript 中的数组与对象效率之后,我现在有点困惑。看起来数组比对象执行得更快,我们可以使用“关联数组”(带孔的数组)将数组索引与对象 ID 匹配。

标签: reactjsreduxnormalizr

解决方案


推荐阅读