- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
假设我有一个由 boolean 值组成的数组。
myArray = [false,false,false]
而且我需要根据每个状态做不同的事情。
例如:
[false,true,false], [false,false,true], [true,true,false], ...
等等。
通常这种操作是通过检查每个单独的元素是否合适来完成的。
例如:
if(!myArray[0] && myArray[1] && !myArray[2]) do A
if(!myArray[0] && !myArray[1] && myArray[2]) do B
if(myArray[0] && myArray[1] && !myArray[2]) do C
...
而不是那样做。我将数组转换为字符串:
switch(JSON.stringify(myArray))
case : "[false,true,false]"
do A
break
case : "[false,false,true]"
do B
break
case : "[true,true,false]"
do C
break
......
这被认为是好的做法吗?使用此方法我可能会遇到任何隐藏的错误吗?这种方法会增加可读性吗?
最佳答案
JSON.stringify
的使用对于(JSON 兼容的)原语(即 boolean 值、字符串、数字、null)的数组(或数组(或数组...))可以正常工作。没有歧义。 ECMAScript 规范也清楚地说明了在不同值之间产生的“差距”:它应该是空字符串,除非通过可选参数明确定义不同。参见 ECMAScript Language Specification on the topic .
需要注意的是 undefined
不是 JSON 中的内容,因此 [null]
和 [undefined]
都将被字符串化为“[无效的]”。但由于您只使用了 false
和 true
,所以这不是问题。
现在回答您的问题:
Is this considered good practice?
这是一个见仁见智的问题。我的第一直觉说“不”,主要是因为类型转换,但由于您的特定用例(即 boolean 数组)没有任何警告,我们真的没有太多可批评的地方。
Is there any hidden error I might face with this method?
没有
Will this method increase readability ?
是
然而,至少有一种替代方案具有所有相同的优点,但不依赖于某些数据类型转换:
如果您的数组是 boolean 数组,您可以选择使用数字数据类型,其中数字的每个二进制位对应数组版本中的一个 boolean 值。
预计此方法将比 strinfigication 选项更有效,因为数据类型转换显然需要一些时间。
这是原始数组模式的运行:
let arr = [false, false, true];
if (!arr[0] && arr[1] && !arr[2]) console.log("do A");
if (!arr[0] && !arr[1] && arr[2]) console.log("do B");
if (arr[0] && arr[1] && !arr[2]) console.log("do C");
下面是使用位集实现的相同逻辑:
let bitset = 0b001;
if (bitset === 0b010) console.log("do A");
if (bitset === 0b001) console.log("do B");
if (bitset === 0b110) console.log("do C");
如果您需要比数字数据类型(53 位)更多的位,那么您可以选择 BigInt。例如:
let bitset = 0b1010101010101010101010101010101010101010101010101010101n;
// A partial comparison
if ((bitset & 0b100010001n) === 0b100010001n) console.log("do A");
当然,0b
字面量不是必须的;这只是为了突出与数组版本的对应关系。您可以通过以十六进制表示法 (0x
) 或什至是纯十进制表示法来保存一些字符,尽管后者对于您的代码的读者来说更加晦涩难懂。
关于javascript - 字符串化数组是一个好习惯吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63480324/
在我生活的世界中,构建一个将所有飞镖都扔到墙上的解决方案,并希望其中一些能命中靶心是一种非常糟糕的解决方案方法。 那么,我的问题出现了,什么时候在约定可接受的生产系统中使用 INSERT IGNORE
在数据处理时,经常会因为index报错而发愁。不要紧,本次来和大家聊聊pandas中处理索引的几种常用方法。 1.读取时指定索引列 很多情况下,我们的数据源是 CSV 文件。假设
关闭。这个问题是opinion-based .它目前不接受答案。 想要改进这个问题? 更新问题,以便 editing this post 可以用事实和引用来回答它. 关闭 6 年前。 Improve
我是一名优秀的程序员,十分优秀!