Javascript 将数组字符串化是一种好的做法吗?

Javascript 将数组字符串化是一种好的做法吗?,javascript,arrays,switch-statement,boolean,Javascript,Arrays,Switch Statement,Boolean,假设我有一个由布尔值组成的数组 myArray=[false,false,false] 我需要根据每个状态做不同的事情 例: [假,真,假],[假,假,真],[真,真,假] 等等 通常这种操作是通过检查每个单独的元素来完成的 例: 而不是那样做。我将数组转换为字符串: switch(JSON.stringify(myArray)) case : "[false,true,false]" do A break case : &qu

假设我有一个由布尔值组成的数组

myArray=[false,false,false]

我需要根据每个状态做不同的事情

例:

[假,真,假],[假,假,真],[真,真,假]

等等

通常这种操作是通过检查每个单独的元素来完成的

例:

而不是那样做。我将数组转换为字符串:

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
    ......
这是否被视为良好做法?使用此方法是否会遇到任何隐藏的错误?
这种方法会增加可读性吗?

根据上下文,它本身没有多大错误;这些布尔值有多少,它们来自哪里/是什么设置了它们,有多少情况,等等。糟糕的是,很难理解发生了什么,也很难进行调试,特别是如果其中有10+个值的话

您可能会将每个布尔值转换为在该上下文中表示某个内容的字符串/单词,从而得到一个句子。如果每个布尔值都有一个唯一的单词,那么就可以省去假单词,这样就只需要写下某些组合


您还可以使用myArray.join(',')
来代替
JSON.stringify()
,它输出
true、true、false
(因此没有括号)。

您的目标是编写一个可读的if?
Stringify是一个解决方案,但(可能只对我来说)有点奇怪

这是我的建议。编写如下函数:

isEqual(left, right) {
    if (left.length !== right.length) return false;

    for (var i = 0; i < left.length; i++) {
        if (left[i] !== right[i]) return false;
    }

    return true;
}
if (isEqual(array, [true, false, true]))  alert('isEqual');
关于使用JSON.stringify 使用
JSON.stringify
可以很好地处理(与JSON兼容的)原语的数组(数组的数组…),即布尔值、字符串、数字、null。没有含糊不清的地方。ECMAScript规范还明确了在不同值之间产生的“间隙”:它应该是空字符串,除非通过可选参数以不同的方式显式定义。看

需要注意的是,
undefined
在JSON中不是一件事,因此
[null]
[undefined]
都将字符串化为“[null]”。但由于您只使用了
false
true
,因此这不是问题

现在回答你的问题:

这是否被视为良好做法

这是一个意见问题。我的第一个直觉是“不”,主要是因为类型转换,但由于您的特定用例(即布尔数组)没有任何警告,因此我们真的没有什么可批评的

使用此方法是否会遇到任何隐藏的错误

没有

这个方法会增加可读性吗

但是,至少有一种替代方案具有相同的优点,但不依赖于某些数据类型转换:

备选方案:位集 如果数组是布尔数组,则可以选择使用数字数据类型,其中数字的每个二进制位对应于数组版本中的布尔值

可以预期,这种方法将比strinfigation选项更有效,因为数据类型转换显然需要一些时间

以下是原始阵列模式的运行:

让arr=[false,false,true];
如果(!arr[0]&&arr[1]&&&arr[2])console.log(“执行A”);
如果(!arr[0]&&&!arr[1]&&arr[2])console.log(“do B”);

if(arr[0]&&arr[1]&&arr[2])console.log(“do C”)
感觉您的原始数组本来应该是一个位集,但它可以随上下文而变化。ShioT说了什么。您还可以尝试将它变成一个对象:
{prop1:true,prop2:true,…}
。这样可以获得更高的可读性,因为您可以使用键来检查值。你现在这样做,我可以想象它会很快变得混乱。如果您在几个月甚至几年后查看该代码,您将很难理解为什么这个顺序会这样做,而另一个顺序会做其他事情。没错,使用对象命名可能是比单纯的数组更好的解决方案。此外,字符串化对象还应该生成一个更复杂、更具可读性的唯一字符串。您确信JSON字符串化操作已经标准化到了可靠的程度,并且永远不会改变吗?例如,某个特定浏览器是否会将结果字符串化为“
”[false,false,false]”
(带空格)?就JSON而言,这个结果同样有效,但会破坏您的代码…@deceze有可能,但很可能不会发生。stringify()有一个可选的“space”参数,可以在需要时插入空格。默认情况下,不应添加空白。或者如果你特别偏执,想要安全。只需简单地添加。替换(“,”),以确保没有空格。这似乎是一个很好的解决方案。但在循环的更大数据集中可能也会面临性能下降。是的,但它比stringify和string等于check要小。
if (isEqual(array, [true, false, true]))  alert('isEqual');