Ich habe ein Array mit Städtenamen und Postnummern, in denen ich suchen muss. Ich kann nach der Stadt suchen und das Ergebnis erhalten, aber wenn ich nach einer Nummer suche, wird sie nicht gefunden. Meine Frage ist also, wie kann ich meine Suchfunktion so einsetzen?

Mein Skript und Array sind wie folgt:

Kleine Probe des Arrays

 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 ;

    });
});

Was passiert ist, wenn ich Stadt 2 eingebe, erhalte ich das folgende Ergebnis: Stadt 2 i = 1 k = 1

So weit so gut, aber ich kann die "0" -Auflistung im Array (9900) im Ergebnis nicht erhalten.

Und ebenso kann ich das Array nicht nach der 9900-Nummer durchsuchen, um das Ergebnis zurückzubekommen ...

0
Nicolai Zoëga 18 Jän. 2019 im 13:57

3 Antworten

Beste Antwort

Dies liegt daran, dass Sie strikte Gleichheit (===) in Ihrer if-Bedingung:

postnummer[i][k] === SearchValue

b.value gibt eine Zeichenfolge zurück (MDN)). Wenn Sie in Ihre Eingabe ein 9900 eingeben, lautet SearchValue "9900" und nicht 9900

Hier ist ein funktionierender Ausschnitt

$(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
adiga 18 Jän. 2019 im 11:59

Genau wie bei einer anderen Lösung können Sie .reduce in Ihrem postnummer Array verwenden, um die gefundenen Indizes des Suchobjekts zu ermitteln.

Dies gibt zwei Arrays zurück, wenn Sie 9900 eingeben. Wenn Sie dies tun, erhalten Sie die Indizes für das erste Array und den Index von 9900. Darüber hinaus erhalten Sie den Index des zweiten Arrays und den Index, wo sich 9900 befindet.

Siehe Arbeitsbeispiel unten:

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);
0
Nick Parsons 18 Jän. 2019 im 11:22

Da es erforderlich war, den Suchwert entweder mit String oder Number zu vergleichen. Möglicherweise möchten Sie versuchen, es in Number zu konvertieren und auf den ursprünglichen Zeichenfolgenwert zurückzugreifen, wenn die Konvertierung fehlschlägt (d. H. Wenn parseInt NaN zurückgibt):

SearchValue = parseInt(SearchValue) || SearchValue;

Dann verwenden Sie einfach einen strengen Vergleich:

postnummer[i][k] === SearchValue

Auf diese Weise behalten Sie die Möglichkeit, sowohl nach numerischen als auch nach Zeichenfolgenwerten zu vergleichen.

0
antonku 18 Jän. 2019 im 23:05