Javascript 如何为“客户”捆绑案例;数据-“;switch语句中的属性?

Javascript 如何为“客户”捆绑案例;数据-“;switch语句中的属性?,javascript,variables,switch-statement,case,Javascript,Variables,Switch Statement,Case,我正在运行一个switch语句,其中有相当多的案例处理数据属性 目前,我被以下问题困扰: switch(attribute) { case "value": case "data-vv-validations": case "data-relation": case "data-tolerance": case "data-theme": case "type": case "readonly": case "size":

我正在运行一个switch语句,其中有相当多的案例处理
数据属性

目前,我被以下问题困扰:

switch(attribute) { 
    case "value":
    case "data-vv-validations":
    case "data-relation":
    case "data-tolerance":
    case "data-theme":
    case "type":
    case "readonly":
    case "size":
      if (setters[attribute]) {
        element.setAttribute(attribute, setters[attribute]);
      }
    break;
 }
我想知道是否有可能将所有
数据-
属性合并到一个
案例中,因为列出我遇到的所有可能选项有点“不通用”

问题:
在CSS选择器中,我可以做一些类似于
[class*=“ui图标-”]
的事情。我是否可以使
案例
值更通用


谢谢

简单地用以下方法解决:

var attributeSwitch = attribute.indexOf("data-") == 0 ? "data-*" : attribute;

case(attributeSwitch){
    case "value":
    case "data-*":
    case "type":
    case "readonly":
    case "size":
      if (setters[attribute]) {
        element.setAttribute(attribute, setters[attribute]);
      }
    break;
}

有点。您可以查看第一个字符是否为
“data-
,如果是,只需将这些字符用于开关即可

var a = attribute.slice(0, 5) === "data-" ? "data-" : attribute;

switch(a) { 
    case "value": case "data-": case "type": case "readonly": case "size":
      if (setters[attribute]) {
        element.setAttribute(attribute, setters[attribute]);
      }
    break;
 }
这会将所有
数据-
属性减少为单个可测试值。请注意,您仍然使用
setters[]
的完整
属性


或者,由于您似乎已经在
setters
映射中拥有属性名称,您可以这样做:

if (setters[attribute]) {
    element.setAttribute(attribute, setters[attribute]);
}
您的
开关
似乎是多余的,因为您执行此操作时几乎执行了相同的测试:

if (setters[attribute]) {

或者如果您需要专门测试名称,那么

if (setters.hasOwnProperty(attribute) && setters[attribute]) {
不,你不能做“一般案例陈述”。 但您可以使用一个可能值的数组,然后检查该值是否为其中之一

function inArray(array, value) {
    for(var i=0, len=array.length; i<len; i++) {
        if(array[i] == value) {
            return true;
        }
    }
    return false;
}

var possibleValues = ["value", 
                     "data-vv-validations", 
                     "data-relation", 
                     "data-tolerance", 
                     "data-theme", 
                     "type", 
                     "readonly", 
                     "size"];

if (setters[attribute] && inArray(possibleValues, attribute)) {
    element.setAttribute(attribute, setters[attribute]);
}
函数数组(数组,值){

对于(var i=0,len=array.length;i@frequent:请参阅我的更新。您的
switch
语句似乎有点多余。我确实有更多的情况需要解决run@frequent:哦,好的。那就更有意义了。我认为这不是一个好代码。它使用了一些偶然的模式(可能会随着时间的推移而改变)如果您认为其他解决方案增加了“太多的开销”,那么我建议更改您的html,为这些“特殊”节点添加一个属性:@jgroenen:描述一下您在一组标识符中所说的“意外模式(可能随时间变化)”是什么意思“您需要接受任何数据-*,或者您事先知道的其中一些数据?您到底想对这个开关盒做什么?您不能只保留开关盒而只执行setters[属性]检查?@jgroenen:no。我正在生成元素并设置属性。上面的开关用于所有需要逻辑的属性,例如输入是
只读的
,还是选择了
选项。请参阅