【问题标题】:JavaScript: match variable to element in array of arraysJavaScript:将变量匹配到数组数组中的元素
【发布时间】:2016-09-02 21:32:33
【问题描述】:

我从后端加载了前两个变量,然后我想匹配我得到的品牌名称并返回一个两个字母的代码。我将相关品牌放在一系列数组中。

似乎match() 不是一个选项,因为我不能在regExp() 中放置变量。

这不起作用:

if (brand.indexOf(brand_code[i])) {
    bc = brand_code[i][1];
}

这不起作用。

if (brand_code[i][0]===brand)
    bc = brand_code[i][1];
}

这是我最近的尝试。

$(document).ready(function() {
    var phone_model='$request.getHeader("x-wurfl-model-name")',
        brand='$request.getHeader("x-wurfl-brand-name")',
        brand_code=[
            ['Alcatel','AL'],
            ['Huawei','HU'],
            ['LG','LG'],
            ['Motorola','MT'],
            ['Samsung','SA'],
            ['Unimax','UX'],
            ['ZTE','ZE']];
    for (var i = brand_code.length - 1; i >= 0; i--) {
        if ($.inArray(brand,brand_code[i])) {
            bc = brand_code[i][1];
        }
    }
    $('.faq .mobile_tutorial a').append(bc+phone_model);
});

这给了我无法读取未定义的属性“3”的错误 在哪里phone_model='Z990g' & brand='ZTE'

我哪里错了?

【问题讨论】:

  • indexOf 返回索引的数字,而不是真/假。如果未找到,则返回-1brand的内容是什么?

标签: javascript jquery arrays loops


【解决方案1】:

如果您在变量brand_code 中以不同的方式构造数据,会变得容易一些:

    brand_code={
        'Alcatel':'AL',
        'Huawei':'HU',
        'LG':'LG',
        'Motorola':'MT',
        'Samsung':'SA',
        'Unimax':'UX',
        'ZTE':'ZE'
    };
    bc = brand_code[brand];
}

这不需要通过数组。如果您使用上面的基于对象的查找,大多数 JavaScript 引擎会在恒定时间内找到匹配项。在 ES 中,您可以使用 Map 来实现相同的目的和相同的效率。

关于你的尝试

$.inArrayZTE 匹配数组的第一个元素时返回 0,因此在这种情况下 if 条件将是 false。但更糟糕的是,当找不到ZTE 时,该方法返回-1,这使得if 条件为真。

所以,如果你把:

if ($.inArray(brand,brand_code[i])>-1) {

来自jQuery documentation

$.inArray() 方法类似于 JavaScript 的原生 .indexOf() 方法,因为它在找不到匹配项时返回 -1。如果数组中的第一个元素匹配值,$.inArray() 返回 0。

【讨论】:

  • 谢谢。请注意,在性能方面,这击败了 filterreduce,它们必须迭代数组。但是,如果 OP 的数据很小,这并不相关,就像看起来那样。
【解决方案2】:

使用Array.filter 查找匹配项,然后您可以检查结果的长度是否> 0 并从中获取result[0][1],或者使用Array.reduce 仅返回代码:

// filter down to match and reduce the match to it's code value
brand_code.filter(function(pair) { 
    return pair[0] === brand 
}).reduce(function(out, match) { 
    return match[1]; 
}, '');

或 ES6:

brand_code.filter(pair => pair[0] === brand)
          .reduce((_, match) => match[1], '');

【讨论】:

  • 这非常简洁,我绝对希望 ES6 是一个选项。遗憾的是,我必须支持一些仍在使用 Android 2.3 的设备。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-02-12
  • 1970-01-01
  • 2016-06-02
  • 1970-01-01
  • 1970-01-01
  • 2013-05-28
  • 2018-09-08
相关资源
最近更新 更多