javascript - 当大多数键具有相同的值时,在文件中构造数据的最佳方法是什么?
问题描述
我正在开发一个浏览器扩展程序,并且有一组项目,必须映射到某些类别。
item-1: category-1
item-2: category-1
item-3: category-2
item-4: category-2
...
项目到类别的映射保存在一个文本文件 (json) 中,但是当扩展程序运行时,我只需要来自所有项目/类别对的大约 60 个项目的子集。作为键,我有一个项目列表,我需要在文件中搜索它们的类别。文件中有大约 200 个项目和 5 个类别。
将所有项目保存为键,将类别保存为它们的值会产生很多冗余。因此,我想到将类别用作键,将项目用作值,如下所示:
category-1:
item-1,
item-2
category-2,
item-3,
item-4
...
但是像这样我必须遍历所有类别来搜索我正在寻找的值,这不是一个理想的解决方案。
如何以某种方式构建我的数据,使冗余最小化并且数据处理尽可能快?或者有没有比遍历所有类别更好的方法来读取我的第二个示例中的数据?
其他存储数据的格式都可以,只要能用 JavaScript 处理即可。
解决方案
大约有 200 个项目和 5 个类别。
在这种规模下,您根本不必考虑这一点,除非您将在烤面包机上运行您的应用程序。
我建议只将项目保存在数据存储中的平面列表中(类似于 RDBMS 对数据库行所做的事情)。
如果您需要单个类别中的所有项目,请使用.filter(item => item.category === something)
或类似;如果您真的喜欢它,您可以在加载数据(或数据更改时)时预先缓存该映射,例如
const byCategory = {};
items.forEach(item =>
(byCategory[item.category] =
byCategory[item.category] || []).push(item)
);
推荐阅读
- ansible - 在 Ansible Playbook 中以管道进程为目标
- android - 我想将相册存储在 Firebase 数据库和存储中
- json - Flutter:我需要 dart obj 和映射的帮助
- javascript - 如果<16,我如何检查给定的密钥年龄并删除它们
- javascript - 我想根据数据选项卡 ID 选择复选框
- sql - 选择,在哪里,分组
- c++ - 尝试使用 C++ 中的函数来计算二维向量是否垂直于另一个
- rust - 四处移动对象,然后调用消耗对象自身的方法会产生“无法移出借来的内容”
- python - 定义一个名为 food 的函数,它接收两个参数
- swift - 将 func loadview 中声明的 self.view 约束到视图控制器的部分区域