¿Cómo encontrar el índice de matriz con un valor?


Respuestas:


316

Puedes usar indexOf:

var imageList = [100,200,300,400,500];
var index = imageList.indexOf(200); // 1

Obtendrá -1 si no puede encontrar un valor en la matriz.


2
puede usar developer.mozilla.org/en/JavaScript/Reference/Global_Objects/… o cualquier marco de Javascript para solucionarlo.
voigtan

1
Acabo de descubrir que no funcionará en IE8. Cual es mi alternativa
joedborg

@voigtan ¿Cómo agrego esto a mi JS?
joedborg

55
Lo he hecho, gracias. ¡IE algún día se pondrá al día con los tiempos modernos!
joedborg

Tampoco funcionará en IE reciente si está en modo de compatibilidad
pelms

74

Para la matriz de objetos, use mapcon indexOf:

var imageList = [
   {value: 100},
   {value: 200},
   {value: 300},
   {value: 400},
   {value: 500}
];

var index = imageList.map(function (img) { return img.value; }).indexOf(200);

console.log(index);


En los navegadores modernos puede usar findIndex:

var imageList = [
   {value: 100},
   {value: 200},
   {value: 300},
   {value: 400},
   {value: 500}
];

var index = imageList.findIndex(img => img.value === 200);

console.log(index);

Es parte de ES6 y es compatible con Chrome, FF, Safari y Edge


1
Tenga en cuenta que findIndex no está implementado en IE 11
Bindrid

2
@Bindrid está escrito en la respuesta, vea "Es parte de ES6 y es compatible con Chrome, FF, Safari y (lamentablemente solo) IE edge"
Jaqen H'ghar

17

Utilice la función de jQuery jQuery.inArray

jQuery.inArray( value, array [, fromIndex ] )
(or) $.inArray( value, array [, fromIndex ] )

Iba a usar el código marcado como la respuesta correcta, pero parece que ese código no funcionará en todas las versiones de IE. Esta respuesta funciona en todas las versiones de IE, pero cambié ligeramente el código: var arrayPosition = $ .inArray (value, Array); funciona perfectamente
James Blackburn

66
jQuery ≠ Javascript
Andrew

13

Aquí hay otra forma de encontrar el índice de valor en una matriz compleja en javascript. Espero ayudar a alguien de hecho. Supongamos que tenemos una matriz de JavaScript de la siguiente manera,

var studentsArray =
     [
    {
    "rollnumber": 1,
    "name": "dj",
    "subject": "physics"
   },
   {
   "rollnumber": 2,
  "name": "tanmay",
  "subject": "biology"
   },
  {
   "rollnumber": 3,
   "name": "amit",
   "subject": "chemistry"
   },
  ];

Ahora si tenemos el requisito de seleccionar un objeto particular en la matriz. Supongamos que queremos encontrar un índice de estudiante con el nombre Tanmay.

Podemos hacerlo iterando a través de la matriz y comparando el valor en la clave dada.

function functiontofindIndexByKeyValue(arraytosearch, key, valuetosearch) {

    for (var i = 0; i < arraytosearch.length; i++) {

    if (arraytosearch[i][key] == valuetosearch) {
    return i;
    }
    }
    return null;
    }

Puede usar la función para encontrar el índice de un elemento particular como se muestra a continuación

var index = functiontofindIndexByKeyValue(studentsArray, "name", "tanmay");
alert(index);



6

Array.indexOfno funciona en algunas versiones de Internet Explorer, aunque hay muchas formas alternativas de hacerlo ... vea esta pregunta / respuesta: ¿Cómo verifico si una matriz incluye un objeto en JavaScript?


de acuerdo con esta página developer.mozilla.org/en-US/docs/JavaScript/Reference/… necesita Internet Explorer 9 para esta función (asumí casi erróneamente que solo estábamos hablando de IE 6 aquí)
Simon_Weaver

@Simon_Weaver en esa página que vinculó hay un polyfill para todos los navegadores que usan JavaScript 1.6 y superior
Manse

5

Cuando las listas no son extremadamente largas, esta es la mejor manera que sé:

function getIndex(val) {
    for (var i = 0; i < imageList.length; i++) {
        if (imageList[i] === val) {
            return i;
        }
    }
}

var imageList = [100, 200, 300, 400, 500];
var index = getIndex(200);

5

Es posible usar una ES6funciónArray.prototype.findIndex .

MDN dice :

El findIndex()método devuelve el índice del primer elemento en la matriz que satisface la función de prueba proporcionada. De lo contrario, se devuelve -1.

var fooArray = [5, 10, 15, 20, 25];
console.log(fooArray.findIndex(num=> { return num > 5; }));

// expected output: 1

Encuentre un índice por propiedad de objeto.

Para buscar un índice por propiedad de objeto:

yourArray.findIndex(obj => obj['propertyName'] === yourValue)

Por ejemplo, hay una matriz de este tipo:

let someArray = [
    { property: 'OutDate' },
    { property: 'BeginDate'},
    { property: 'CarNumber' },
    { property: 'FirstName'}
];

Luego, el código para encontrar un índice de propiedad necesaria se ve así:

let carIndex = someArray.findIndex( filterCarObj=> 
    filterCarObj['property'] === 'CarNumber');

0

Aquí está mi opinión sobre esto, parece que la mayoría de las soluciones de la gente no comprueban si el elemento existe y elimina valores aleatorios si no existe.

Primero verifique si el elemento existe buscando su índice . Si existe, elimínelo por su índice utilizando el método de empalme

elementPosition = array.indexOf(value);

if(elementPosition != -1) {
  array.splice(elementPosition, 1);
}

0

En una matriz multidimensional .


Matriz de referencia:

var array = [
    { ID: '100', },
    { ID: '200', },
    { ID: '300', },
    { ID: '400', },
    { ID: '500', }
];

Usando filtery indexOf:

var in_array = array.filter(function(item) { 
    return item.ID == '200' // look for the item where ID is equal to value
});
var index = array.indexOf(in_array[0]);

Recorriendo cada elemento de la matriz usando indexOf:

for (var i = 0; i < array.length; i++) {
    var item= array[i];
    if (item.ID == '200') { 
        var index = array.indexOf(item);
    }
}

-1
// Instead Of 
var index = arr.indexOf(200)

// Use 
var index = arr.includes(200);

Tenga en cuenta : la función Incluye es un método de instancia simple en la matriz y ayuda a encontrar fácilmente si un elemento está en la matriz (incluido NaN a diferencia de indexOf)


1
Además de esto, solo le indicará si existe, en lugar de obtener el índice / elemento, tenga en cuenta la compatibilidad (es decir, no IE): caniuse.com/#search=includes
moto

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.