我有一个包含城市名称和邮政编码的数组,我需要在其中进行搜索,我可以搜索城市并获取结果,但是当我搜索数字时找不到它。所以我的问题是,如何使我的搜索功能正常运行?
我的脚本和数组是这样的:
数组的小样本
Array
(
[0] => Array
(
[0] => 9900
[1] => Town 1
)
[1] => Array
(
[0] => 9900
[1] => Town 2
)
[2] => Array
(
[0] => 9940
[1] => Town 3
)
[3] => Array
(
[0] => 9970
[1] => Town 4
)
[4] => Array
(
[0] => 9981
[1] => Town 5
)
)
$(document).ready(function(){
$(".searchinput").keyup(function(){
var b = document.getElementsByClassName('searchinput')[0].value;
var b = document.getElementById("Searchfield")
var SearchValue=b.value;
var i=0, k=0, indx=[], msg;
for ( i=0; i<postnummer.length; i++)
{ for ( k=0; k<postnummer[i].length; k++)
{ if (postnummer[i][k] === SearchValue){ indx = [i,k]; break; }
} }
if(typeof indx[0] == "undefined" || typeof indx[1] == "undefined"){
msg=("Not found"); }
else { msg="i= "+indx[0]+" k= "+indx[1]; }
var a = document.getElementById("Result");
a.value = b.value + " - " + msg ;
});
});
当我输入Town 2时,会发生以下结果:Town 2 i = 1 k = 1
到目前为止还不错,但是我无法在结果中得到数组(9900)中的“ 0”列表。
同样,我无法在数组中搜索9900号以将结果返回...
答案 0 :(得分:1)
这是因为您在if条件下正在执行strict equality(===
):
postnummer[i][k] === SearchValue
b.value
返回一个字符串(MDN)。如果您在输入中输入9900
,则SearchValue
将为“ 9900”,而不是9900
这是一个有效的代码段
$(document).ready(function() {
$(".searchinput").keyup(function() {
var postnummer = [
[9900, 'Town 1'],
[9900, 'Town 2'],
[9940, 'Town 3'],
[9970, 'Town 4'],
[9981, 'Town 5']
],
b = document.getElementById("Searchfield"),
SearchValue = b.value, // this returns a string
i = 0,
k = 0,
indx = [];
for (i = 0; i < postnummer.length; i++) {
for (k = 0; k < postnummer[i].length; k++) {
// changed it to ==
if (postnummer[i][k] == SearchValue) {
indx = [i, k];
break;
}
}
}
if (indx.length > 1)
console.log(indx)
});
});
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<input class="searchinput" id="Searchfield" />
答案 1 :(得分:0)
因为需要将搜索值与String
或Number
进行比较。您可能希望尝试将其转换为Number
并在转换失败时(即parseInt
返回NaN
时退回原始字符串值):
SearchValue = parseInt(SearchValue) || SearchValue;
然后使用严格的比较:
postnummer[i][k] === SearchValue
通过这种方式,您将保留通过数字和字符串值进行比较的可能性。
答案 2 :(得分:0)
作为另一种解决方案,您可以在.reduce
数组上使用postnummer
来确定找到的搜索主题索引。
如果输入9900
,它将返回两个数组。如果这样做,您将获得第一个数组的索引和其中的9900
的索引。除此之外,您还将获得第二个数组的索引以及9900
所在位置的索引。
请参见下面的工作示例:
const postnumber = [[9900, 'Town 1'],[9900, 'Town 2'],[9940, 'Town 3'], [9970, 'Town 4'], [9981, 'Town 5']],
search = '9900', /* 9900 (int) also works due to '==' in .reduce (not strictly testing the value) */
res = postnumber.reduce((acc, [num, town], i) => {
if (num == search) return [...acc, [i, 0]];
if (town == search) return [...acc, [i, 1]];
return acc;
}, []);
console.log(res);