Por ejemplo, tengo:
var Data = [
{ id_list: 1, name: 'Nick', token: '312312' },
{ id_list: 2, name: 'John', token: '123123' },
]
Entonces, quiero ordenar / invertir este objeto name
, por ejemplo. Y luego quiero obtener algo como esto:
var Data = [
{ id_list: 2, name: 'John', token: '123123' },
{ id_list: 1, name: 'Nick', token: '312312' },
]
Y ahora quiero saber el índice del objeto con propiedad name='John'
para obtener el valor del token de propiedad.
¿Cómo resuelvo el problema?
javascript
arrays
object
rsboarder
fuente
fuente
{Key:Value}
, lo arreglé para ti.Data
objeto nativo . Es simplemente un nombre de variable en mayúscula, que está en contra de la convención. Si alguien más está molesto por esto, haré modificaciones a la pregunta y las respuestas para corregir este nombre.Respuestas:
Como sugieren las otras respuestas, recorrer la matriz es probablemente la mejor manera. Pero lo pondría en su propia función y lo haría un poco más abstracto:
Con esto, no solo puede encontrar cuál contiene 'John' sino que también puede encontrar cuál contiene el token '312312':
EDITAR: Función actualizada para devolver -1 cuando no se encuentra, por lo que sigue la misma construcción que Array.prototype.indexOf ()
fuente
Dado que la parte de clasificación ya está respondida. Solo voy a proponer otra forma elegante de obtener el índice de una propiedad en su matriz
Tu ejemplo es:
Tu puedes hacer:
Array.prototype.map
no está disponible en IE7 o IE8. Compatibilidad con ES5Y aquí está con ES6 y sintaxis de flecha, que es aún más simple:
fuente
Si estás de acuerdo con el uso de ES6. Las matrices ahora tienen la función findIndex . Lo que significa que puedes hacer algo como esto:
fuente
name: John
) esto solo devolverá el primer partidoCuál es una versión simplificada de:
Desde mozilla.org:
fuente
token
campo en lugar delname
campo, podría haber problemas, como seData[0].token == 312312
evalúatrue
, pero seData[0].token === 321321
evalúa comofalse
.Si tiene problemas con IE, puede usar la función map () que es compatible desde 9.0 en adelante:
fuente
La única forma conocida para mí es recorrer toda la matriz:
o mayúsculas y minúsculas:
En el resultado, el índice variable contiene el índice del objeto o -1 si no se encuentra.
fuente
una forma prototípica
fuente
Puede usar Array.sort usando una función personalizada como parámetro para definir su mecanismo de clasificación.
En su ejemplo, daría:
La función de clasificación debe devolver -1 si a debe venir antes que b, 1 si a debe venir después de b y 0 si ambos son iguales. Depende de usted definir la lógica correcta en su función de clasificación para ordenar la matriz.
Editar: se perdió la última parte de su pregunta donde desea conocer el índice. Tendría que recorrer la matriz para encontrar eso como otros han dicho.
fuente
Simplemente revise su matriz y encuentre la posición:
fuente
if(Data[item].name == 'John')
, lo arreglé para ti.Esto puede ser útil.
Copié esto de https://developer.mozilla.org/en/JavaScript/Guide/Working_with_Objects
fuente
¿Por qué no usas una pequeña solución?
Cree una nueva matriz con nombres como índices. después de eso, todas las búsquedas usarán índices. Entonces, solo un bucle. ¡Después de eso no necesitas recorrer todos los elementos!
http://jsbin.com/xibala/1/edit
ejemplo en vivo
fuente
Respuesta extendida de Chris Pickett porque en mi caso necesitaba buscar más profundo que un nivel de atributo:
Puede pasar 'attr1.attr2' a la función
fuente
¿Qué hay de esto? :
Suponiendo que esté usando lodash o underscorejs.
fuente
Si tiene un objeto con objetos múltiples, si desea saber si algún objeto está incluido en el objeto maestro, simplemente coloque find (MasterObject, 'Object to Search'), esta función devolverá la respuesta si existe o no (VERDADERO o FALSO ), Espero ayuda con esto, puede ver el ejemplo en JSFiddle .
fuente
fuente
fuente
Si desea obtener el valor del token de propiedad, también puede probar esto
donde _.findKey es una función de lodash
fuente
Alternativamente a la respuesta de German Attanasio Ruiz, puede eliminar el segundo bucle utilizando Array.reduce () en lugar de Array.map ();
fuente
Usando guión bajo:
fuente