JavaScript:将变量与数组数组中的元素匹配
我从后端加载前两个变量,然后我想匹配我得到的品牌名称并返回两个字母的代码。我将相关品牌放在一系列阵列中 似乎JavaScript:将变量与数组数组中的元素匹配,javascript,jquery,arrays,loops,Javascript,Jquery,Arrays,Loops,我从后端加载前两个变量,然后我想匹配我得到的品牌名称并返回两个字母的代码。我将相关品牌放在一系列阵列中 似乎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).r
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\u model='Z990g'
&brand='ZTE'
我哪里出错了?如果您在变量
brand\u code
中以不同的结构构建数据,则会变得更容易:
brand_code={
'Alcatel':'AL',
'Huawei':'HU',
'LG':'LG',
'Motorola':'MT',
'Samsung':'SA',
'Unimax':'UX',
'ZTE':'ZE'
};
bc = brand_code[brand];
}
这不需要通过数组。如果使用上面基于对象的查找,大多数JavaScript引擎都会在固定时间内找到匹配项。在ES中,您可以使用地图
,以实现相同的目的和相同的效率
关于你的尝试
$.inArray
在ZTE
匹配数组的第一个元素时返回0,因此在这种情况下if
条件将为false
。但更糟糕的是,当未找到ZTE
时,该方法返回-1,这使得if
条件为真
因此,如果您将以下内容放在
if ($.inArray(brand,brand_code[i])>-1) {
从:
$.inArray()
方法类似于JavaScript的本机.indexOf()
方法,在未找到匹配项时返回-1。如果数组中的第一个元素与值匹配,$.inArray()
返回0
如果您在变量
brand_code
中以不同的结构构建数据,则会变得更容易:
brand_code={
'Alcatel':'AL',
'Huawei':'HU',
'LG':'LG',
'Motorola':'MT',
'Samsung':'SA',
'Unimax':'UX',
'ZTE':'ZE'
};
bc = brand_code[brand];
}
这不需要通过数组。如果使用上面基于对象的查找,大多数JavaScript引擎都会在固定时间内找到匹配项。在ES中,您可以使用地图
,以实现相同的目的和相同的效率
关于你的尝试
$.inArray
在ZTE
匹配数组的第一个元素时返回0,因此在这种情况下if
条件将为false
。但更糟糕的是,当未找到ZTE
时,该方法返回-1,这使得if
条件为真
因此,如果您将以下内容放在
if ($.inArray(brand,brand_code[i])>-1) {
从:
$.inArray()
方法类似于JavaScript的本机.indexOf()
方法,在未找到匹配项时返回-1。如果数组中的第一个元素与值匹配,$.inArray()
返回0
使用
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], '');
使用
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], '');
indexOf返回索引的编号,而不是true/false。如果未找到,则返回
-1
。品牌
的内容是什么?indexOf返回索引的数字,不是真/假。如果未找到,则返回-1
。品牌的内容是什么
?谢谢。请注意,在性能方面,这比必须迭代数组的过滤器
和减少
要好。但是如果OP的数据很小的话,这是不相关的,好像是这样。谢谢。请注意,在性能方面,这比必须迭代数组的过滤器
和减少
要好。但是如果OP的数据很小的话,这是不相关的,就像它看起来是这样。这很好,我当然希望ES6是一个选择。遗憾的是,我必须支持一些仍然使用Android 2.3的设备。这非常好,我当然希望ES6是一个选项。遗憾的是,我不得不支持一些仍然使用安卓2.3的设备。