多维度数组JavaScript中的搜索功能问题

时间:2019-01-18 10:57:58

标签: javascript arrays search

我有一个包含城市名称和邮政编码的数组,我需要在其中进行搜索,我可以搜索城市并获取结果,但是当我搜索数字时找不到它。所以我的问题是,如何使我的搜索功能正常运行?

我的脚本和数组是这样的:

数组的小样本

 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号以将结果返回...

3 个答案:

答案 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)

因为需要将搜索值与StringNumber进行比较。您可能希望尝试将其转换为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);