javascript - jQuery.inArray(), cum să-l folosești corect?


Prima dată lucrez cu jQuery.inArray() și se comportă oarecum ciudat.

Dacă obiectul este în array, va returna 0, dar 0 este fals în Javascript. Deci următorul va afișa: "nu este în array"

var myarray = [];
myarray.push("test");

if(jQuery.inArray("test", myarray)) {
    console.log("is in array");
} else {
    console.log("is NOT in array");
}

Va trebui să schimb instrucțiunea if în:

if(jQuery.inArray("test", myarray)==0)

Dar acest lucru face codul greu de citit. Mai ales pentru cineva care nu cunoaște această funcție. Ei se vor aștepta ca jQuery.inArray("test", myarray) să returneze adevărat când "test" se află în array.

Deci întrebarea mea este, de ce se face în acest fel? Nu-mi place deloc. Dar trebuie să existe un motiv bun pentru a face astfel.

Răspuns #1

inArray returnează indexul elementului din array, nu un boolean care indică dacă elementul există în array. Dacă elementul nu a fost găsit, se va returna -1.

Deci, pentru a verifica dacă un element se află în array, folosește:

if(jQuery.inArray("test", myarray) !== -1)

Răspunsul #2

$.inArray returnează indicele elementului dacă este găsit sau -1 dacă nu este — nu o valoare booleană. Deci corect este

if(jQuery.inArray("test", myarray) != -1) {
    console.log("is in array");
} else {
    console.log("is NOT in array");
} 

Răspunsul #3

Modul corect de a folosi inArray(x, arr) este deloc să nu îl folosești și să folosești în schimb arr.indexOf(x).

Numele standard oficial este, de asemenea, mai clar în ceea ce privește faptul că valoarea returnată este un index, astfel încât dacă elementul transmis este primul, veți primi înapoi un 0 (care este fals în Javascript).

(Rețineți că arr.indexOf(x) nu este acceptat în Internet Explorer până la IE9, așa că dacă trebuie să suportați IE8 și versiuni anterioare, aceasta nu va funcționa, iar funcția jQuery este o alternativă mai bună.)

Răspunsul #4

Răspunsul vine din primul paragraf al documentației: verificați dacă rezultatul este mai mare decât -1, nu dacă este adevărat sau fals.

Metoda $.inArray() este similară cu metoda nativă .indexOf() din JavaScript prin faptul că returnează -1 atunci când nu găsește o potrivire. Dacă primul element din cadrul array-ului corespunde valorii, $.inArray() returnează 0.

Pentru că JavaScript tratează 0 ca fiind aproximativ egal cu false (adică 0 == false, dar 0 !== false), dacă verificăm prezența unei valori într-un array, trebuie să verificăm dacă nu este egală cu (sau mai mare decât) -1.

Răspunsul #5

în loc să folosești jQuery.inArray(), poți de asemenea să folosești metoda includes pentru array de intregi:

var array1 = [1, 2, 3];

console.log(array1.includes(2));
// expected output: true

var pets = ['cat', 'dog', 'bat'];

console.log(pets.includes('cat'));
// expected output: true

console.log(pets.includes('at'));
// expected output: false

verifică postarea oficială aici

Răspunsul #6

Funcția inArray returnează indexul obiectului furnizat ca prim argument funcției în array-ul furnizat ca al doilea argument funcției.

Când inArray returnează 0, înseamnă că primul argument a fost găsit în prima poziție a array-ului furnizat.

Pentru a folosi inArray într-o instrucțiune if folosește:

if(jQuery.inArray("test", myarray) != -1) {
    console.log("is in array");
} else {
    console.log("is NOT in array");
}

inArray returnează -1 atunci când primul argument transmis funcției nu este găsit în array-ul transmis ca al doilea argument.

Răspunsul #7

Sau, dacă vrei să fii puțin sofisticat, poți folosi operatorii bitwise not (~) și logical not (!) pentru a converti rezultatul funcției inArray într-o valoare booleană.

if(!!~jQuery.inArray("test", myarray)) {
    console.log("is in array");
} else {
    console.log("is NOT in array");
}

Răspunsul #8

inArray returnează indexul elementului din array. Dacă elementul nu a fost găsit, va fi returnat -1, altfel indexul elementului.

if(jQuery.inArray("element", myarray) === -1) {
    console.log("Not exists in array");
} else {
    console.log("Exists in array");
}