jQuery.inArray (), ¿cómo usarlo bien?

345

La primera vez que trabajo jQuery.inArray()y actúa un poco extraño.

Si el objeto está en la matriz, devolverá 0, pero 0 es falso en Javascript. Entonces se mostrará lo siguiente: "NO está en la matriz"

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

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

Tendré que cambiar la declaración if a:

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

Pero esto hace que el código sea ilegible. Especialmente para alguien que no conoce esta función. Esperarán que jQuery.inArray ("prueba", myarray) sea verdadero cuando "prueba" esté en la matriz.

Entonces mi pregunta es, ¿por qué se hace de esta manera? Realmente no me gusta esto. Pero debe haber una buena razón para hacerlo así.

nbar
fuente

Respuestas:

734

inArraydevuelve el índice del elemento en la matriz, no un valor booleano que indica si el elemento existe en la matriz. Si no se encontró el elemento, -1se devolverá.

Entonces, para verificar si un elemento está en la matriz, use:

if(jQuery.inArray("test", myarray) !== -1)
Dennis
fuente
16
CoffeeScript:if jQuery.inArray('test', myarray) isn't -1
Joshua Pinter el
99
Por supuesto, siempre podría definir su propia función, más intuitiva, como$.isInArray = function(test,array) { return $.inArray(test, array) !== -1; };
Wesley Smith, el
1
O más corto: $.isInArray = function(item, array) { return !!~$.inArray(item, array); };(mantendría un código críptico como ese en una función bien nombrada para mantener clara la intención :))
Dennis
2
Gracias @ Chips_100 por mostrarnos a los alumnos visuales cómo hacerlo bien, sería bueno que jQuery pudiera actualizarse para incluir eso en su propio ejemplo.
asherrard
2
también puedes usarif( $.inArray(test, array) > -1) { // do stuff }
MistyDawn
48

$.inArraydevuelve el índice del elemento si se encuentra o -1 si no lo es, no es un valor booleano. Entonces lo correcto es

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

La respuesta proviene del primer párrafo de la verificación de documentación si los resultados son mayores que -1, no si es verdadero o falso.

El método $ .inArray () es similar al método .indexOf () nativo de JavaScript en el sentido de que devuelve -1 cuando no encuentra una coincidencia. Si el primer elemento dentro de la matriz coincide con el valor, $ .inArray () devuelve 0.

Debido a que JavaScript trata 0 como vagamente igual a falso (es decir, 0 == falso, pero 0! == falso), si estamos verificando la presencia de valor dentro de la matriz, debemos verificar si no es igual a (o mayor que ) -1.

Patsy Issa
fuente
23

La forma correcta de usar inArray(x, arr)es no usarlo en absoluto , y usarlo en su lugar arr.indexOf(x).

El nombre estándar oficial también es más claro sobre el hecho de que el valor devuelto es un índice, por lo tanto, si el elemento pasado es el primero, obtendrá un 0(eso es falso en Javascript).

(Tenga en cuenta que noarr.indexOf(x) es compatible con Internet Explorer hasta IE9 , por lo que si necesita admitir IE8 y versiones anteriores, esto no funcionará y la función jQuery es una mejor alternativa).

6502
fuente
1
Tengo que estar de acuerdo. El nombre de inArray es confuso. Parece que debería devolver un valor booleano, pero hace exactamente lo mismo que indexOf
Tienda de Enrique Moreno el
Cada vez que $.inArrayuso al principio de algún código tengo que ir a arreglar un error, gimo. De todos modos, esta debería ser la respuesta aceptada.
Aluan Haddad
11

O si desea obtener un poco de fantasía, puede usar los operadores bit a bit no (~) y lógico no (!) Para convertir el resultado de la función inArray en un valor booleano.

if(!!~jQuery.inArray("test", myarray)) {
    console.log("is in array");
} else {
    console.log("is NOT in array");
}
Jason
fuente
44
El uso de operadores bit a bit está generalmente prohibido / mal visto en los estándares comunes de codificación de JavaScript. Entonces, si está utilizando un linter (jshint, eslint, etc.) es probable que no obtenga esto a través de la revisión del código. La solución funciona sin embargo.
jhrr
8

Yo suelo usar

if(!(jQuery.inArray("test", myarray) < 0))

o

if(jQuery.inArray("test", myarray) >= 0)
DDan
fuente
3
Aún mejor ...if( $.inArray("test", myarray) > -1 )
MistyDawn
8

El método jQuery inArray () se utiliza para buscar un valor en una matriz y devolver su índice, no un valor booleano. Y si no se encontró el valor, devolverá -1.

Entonces, para verificar si un valor está presente en una matriz, siga la práctica a continuación:

myArray = new Array("php", "tutor");
if( $.inArray("php", myArray) !== -1 ) {

    alert("found");
}

Referencia

Hassan Amir Khan
fuente
7

La inArrayfunción devuelve el índice del objeto suministrado como el primer argumento a la función en la matriz suministrada como el segundo argumento a la función.

Cuando inArrayregresa 0, indica que el primer argumento se encontró en la primera posición de la matriz suministrada.

Para usar inArraydentro de una declaración if, use:

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

inArrayregresa -1cuando el primer argumento pasado a la función no se encuentra en la matriz pasada como el segundo argumento.

Kevin Bowersox
fuente
5

en lugar de usar jQuery.inArray(), también puede usar el includesmétodo para la matriz int:

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

revisa la publicación oficial aquí

Saurabh Solanki
fuente
1
incluye no es compatible con IE - :: use indeOf
anoldermark
3

jQuery.inArray () devuelve el índice del elemento en la matriz, o -1 si no se encontró el elemento. Lea más aquí: jQuery.inArray ()

Darvex
fuente
3

Devolverá el índice del elemento en la matriz. Si no se encuentra, obtendrá-1

Johan
fuente
3

Si queremos comprobar que un elemento está dentro de un conjunto de elementos, podemos hacer, por ejemplo:

var checkboxes_checked = $('input[type="checkbox"]:checked');

// Whenever a checkbox or input text is changed
$('input[type="checkbox"], input[type="text"]').change(function() {
    // Checking if the element was an already checked checkbox
    if($.inArray( $(this)[0], checkboxes_checked) !== -1) {
        alert('this checkbox was already checked');
    }
}
Gustavo Andrade Ferreira
fuente
2
/^(one|two|tree)$/i.test(field) // field = Two; // true
/^(one|two|tree)$/i.test(field) // field = six; // false
/^(раз|два|три)$/ui.test(field) // field = Три; // true

Esto es útil para verificar variables dinámicas. Este método es fácil de leer.

Сергей Савельев
fuente
2

$.inArray()hace EXACTAMENTE LA MISMA COSA que myarray.indexOf()y devuelve el índice del elemento sobre el que está comprobando la existencia de la matriz. Es simplemente compatible con versiones anteriores de IE antes de IE9. Probablemente, la mejor opción es usar el myarray.includes()que devuelve un valor booleano verdadero / falso. Consulte el fragmento a continuación para ver ejemplos de salida de los 3 métodos.

// Declare the array and define it's values
var myarray = ['Cat', 'Dog', 'Fish'];

// Display the return value of each jQuery function 
// when a radio button is selected
$('input:radio').change( function() {

  // Get the value of the selected radio
  var selectedItem = $('input:radio[name=arrayItems]:checked').val();
  $('.item').text( selectedItem );
  
  // Calculate and display the index of the selected item
  $('#indexVal').text( myarray.indexOf(selectedItem) );
  
  // Calculate and display the $.inArray() value for the selected item
  $('#inArrVal').text( $.inArray(selectedItem, myarray) );
  
  // Calculate and display the .includes value for the selected item
  $('#includeVal').text( myarray.includes(selectedItem) );
});
#results { line-height: 1.8em; }
#resultLabels { width: 14em; display: inline-block; margin-left: 10px; float: left; }
label { margin-right: 1.5em; }
.space { margin-right: 1.5em; }
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>

Click a radio button to display the output of
&nbsp;<code>$.inArray()</code>
&nbsp;vs. <code>myArray.indexOf()</code>
&nbsp;vs. <code>myarray.includes()</code>
&nbsp;when tested against
&nbsp;<code>myarray = ['Cat', 'Dog', 'Fish'];</code><br><br>

<label><input type="radio" name="arrayItems" value="Cat"> Cat</label>
<label><input type="radio" name="arrayItems" value="Dog"> Dog</label>
<label><input type="radio" name="arrayItems" value="Fish"> Fish</label>  
<label><input type="radio" name="arrayItems" value="N/A"> ← Not in Array</label>
<br><br>

<div id="results">
  <strong>Results:</strong><br>
  <div id="resultLabels">
    myarray.indexOf( "<span class="item">item</span>" )<br>
    $.inArray( "<span class="item">item</span>", myarray )<br>
    myarray.includes( "<span class="item">item</span>" )
  </div>
  <div id="resultOutputs">
    <span class="space">=</span><span id="indexVal"></span><br>
    <span class="space">=</span><span id="inArrVal"></span><br>
    <span class="space">=</span><span id="includeVal"></span>
  </div>
 </div>

MistyDawn
fuente
Cabe señalar que $.inArraydebería ser el estándar de oro si tiene acceso a la biblioteca jQuery. De lo contrario, se .indexOfdebe utilizar JavaScript con un polyfill para IE8. Manténgase alejado de esas cosas modernas como .includes().
Alexander Dixon
1

Hombre, mira el documento .

por ejemplo:

var arr = [ 4, "Pete", 8, "John" ];
console.log(jQuery.inArray( "John", arr ) == 3);
Alberto Cerqueira
fuente
1

Por alguna razón, cuando intentas buscar un elemento DOM jquery, no funcionará correctamente. Así que reescribir la función haría el truco:

function isObjectInArray(array,obj){
    for(var i = 0; i < array.length; i++) {
        if($(obj).is(array[i])) {
            return i;
        }
    }
    return -1;
}
Joeneter10
fuente
1

var abc = {
      "partner": {
        "name": "North East & Cumbria (EDT)",
        "number": "01915008717",
        "areas": {
        "authority": ["Allerdale", "Barrow-in-Furness", "Carlisle"]
        }
      }
    };
    
    
    $.each(abc.partner.areas, function(key, val){
     console.log(val);
      if(jQuery.inArray("Carlisle", val)) {
        console.log(abc.partner.number);
    }
    });
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>

abhinavxeon
fuente
0

Simplemente nadie usa en $lugar de jQuery:

if ($.inArray(nearest.node.name, array)>=0){
   console.log("is in array");
}else{
   console.log("is not in array");
}
William Hu
fuente
Tengo curiosidad por qué? ¿Hay algún problema de compatibilidad poco común que esto cause? Nunca he tenido ningún tipo de problema al usar el en $lugar de jQuery.
MistyDawn