首页 > 解决方案 > 选择正确的数据结构:布尔检查与数组 .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 需要一个简单的布尔检查,这似乎更快。

所以如果我上面的陈述是正确的,我觉得不得不在冗余和性能之间做出选择(如果错了请更正)。是否有更好的方法,即完全不同的数据结构?

提前致谢!

标签: javascriptarraysangulartypescript

解决方案


有一个单一的流派键和一个具有有意义的二进制表示的整数,如标志:

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,正如其他人在评论中指出的那样。任何适合你的口味


推荐阅读