javascript - 选择正确的数据结构:布尔检查与数组 .include(性能与冗余)
问题描述
我有可以分配一个或多个属性的对象。在我的特殊情况下,总共有 5 个不同的属性。
为简化起见,让我们以一个基本的电影示例为例,它有 5 种不同的流派,可以分配给每部电影。
我想到了两种方法来做到这一点:
- 每个对象的每个属性都有一个布尔值或
- 有一个数组,其中包含每个对象的分配属性列表
这意味着:
选项1:
[{id: 1, name: 'some movie 1', comedy: true, thriller: true, drama: true, action: false, adventure: true},
{id: 2, name: 'some movie 2', comedy: false, thriller: true, drama: false, action: false, adventure: false},
{id: 3, name: 'some movie 3', comedy: true, thriller: true, drama: true, action: false, adventure: true},
{id: 4, name: 'some movie 4', comedy: true, thriller: true, drama: true, action: false, adventure: false}, ...]
选项 2:
[{id: 1, name: 'some movie 1', genre: ['comedy','thriller','drama']},
{id: 2, name: 'some movie 2', genre: ['thriller','drama']},
{id: 3, name: 'some movie 3', genre: ['comedy','thriller','adventure']},
{id: 4, name: 'some movie 4', genre: ['comedy','thriller']}, ...]
我想使用选项 2,因为它更紧凑并且不存储冗余数据(布尔值错误值)。
但是,我担心性能,因为我必须通过 .include() 检查特定属性字符串的数组,而选项 1 需要一个简单的布尔检查,这似乎更快。
所以如果我上面的陈述是正确的,我觉得不得不在冗余和性能之间做出选择(如果错了请更正)。是否有更好的方法,即完全不同的数据结构?
提前致谢!
解决方案
有一个单一的流派键和一个具有有意义的二进制表示的整数,如标志:
comedy drama something else
1 0 1 === 1 * 2^2 + 0 * 2^1 + 1 === 5
你最终:
{
id:1,
name: "some",
genre: 5
}
要查看这是否包括喜剧,您必须测试:
(genre ^ 4) === (genre - 4)
如果您要测试看戏剧,您会这样做:
(5 ^ 2) === (5 - 2) //false
我的意思是你明白了,你也可以选择更短的位掩码genre & 4
,正如其他人在评论中指出的那样。任何适合你的口味
推荐阅读
- php - PHP 我无法在显示 PDF 文件的 HTML 页面上显示按钮
- java - 重写时如何正确调用超类方法?
- firebase - Google Firestore - 没有分页的 REST API
- reactjs - ReactJS - 警告:组件正在更改要控制的文本类型的不受控制的输入 - 编辑功能
- command-line - 将灰度图像转换为具有可定义阈值的 1 位黑/白,保持透明度?
- computer-vision - 是否有任何方法可以在个人单类数据集上注释或标记多个人的图像。对于 YOLOv3?
- html - 如何在查找 id 的同时等待网页
- python - TypeError:'bool' 对象没有回文的属性 '__getitem__'
- powershell - 使用 Powershell 获取 DHCP 客户端信息
- c# - 在邮递员中上传像表单数据这样的文件