valor tiene saber obtener elemento disabled con cambiar boton atributos atributo agregar jquery collections filter traversal

tiene - obtener valor de un boton jquery



Jquery cómo encontrar un objeto por atributo en una matriz (10)

La manera más rápida (y funciona incluso sin jQuery):

var findPurpose = function(purposeName) { for (var i = 0, len = purposeObjects.length; i < len; i++) { if (purposeObjects[i].purpose === purposeName) return purposeObjects[i]; // Return as soon as the object is found } return null; // The object was not found }

Nota

jQuery $ .grep (u otra función de filtrado) no es la solución óptima.

La función $.grep recorrerá todos los elementos de la matriz, incluso si el objeto buscado ya se encontró durante el ciclo. De la documentación de jQuery grep:

El método $ .grep () elimina elementos de una matriz según sea necesario para que todos los elementos restantes pasen una prueba provista. La prueba es una función a la que se le pasa un elemento de matriz y el índice del elemento dentro de la matriz. Solo si la prueba devuelve verdadero, el elemento estará en la matriz de resultados.

Dado que tengo una variedad de objetos "propósito":

//array of purpose objects: var purposeObjects = [ {purpose: "daily"}, {purpose: "weekly"}, {purpose: "monthly"} ];

(por simplicidad, estoy omitiendo otros atributos)

Ahora quiero tener un método que devuelva uno específico de los objetos si se encuentra un nombre de propósito coincidente.

Esto no está funcionando:

function findPurpose(purposeName){ return $.grep(purposeObjects, function(){ return this.purpose == purposeName; }); }; findPurpose("daily");

pero en realidad devuelve una matriz vacía:

[]

Estoy usando JQuery 1.5.2. También he intentado con $ .each () pero sin suerte. Aparentemente, la mayoría de los métodos de JQuery están diseñados para su uso con elementos DOM (como filter() .

¿Alguna idea sobre cómo lograr esto?


El error fue que no puedes usar this en grep, pero debes usar una referencia al elemento. Esto funciona:

function findPurpose(purposeName){ return $.grep(purposeObjects, function(n, i){ return n.purpose == purposeName; }); }; findPurpose("daily");

devoluciones:

[Object { purpose="daily"}]


debe pasar la referencia sobre el elemento en la función grep:

function findPurpose(purposeName){ return $.grep(purposeObjects, function(item){ return item.purpose == purposeName; }); };

Ejemplo


Utilice la función UnDirector.js findWhere ( http://underscorejs.org/#findWhere ):

var purposeObjects = [ {purpose: "daily"}, {purpose: "weekly"}, {purpose: "monthly"} ]; var daily = _.findWhere(purposeObjects, {purpose: ''daily''});

daily sería igual:

{"purpose":"daily"}

Aquí hay un violín: http://jsfiddle.net/spencerw/oqbgc21x/

Para devolver más de uno ( si tenía más en su matriz), podría usar _.where(...)


La mejor, la forma más rápida es

function arrayLookup(array, prop, val) { for (var i = 0, len = array.length; i < len; i++) { if (array[i].hasOwnProperty(prop) && array[i][prop] === val) { return array[i]; } } return null; }


Yo personalmente uso una función más genérica que funciona para cualquier propiedad de cualquier matriz:

function lookup(array, prop, value) { for (var i = 0, len = array.length; i < len; i++) if (array[i] && array[i][prop] === value) return array[i]; }

Usted lo llama así:

lookup(purposeObjects, "purpose", "daily");


Una solución más:

function firstOrNull(array, expr) { for (var i = 0; i < array.length; i++) { if (expr(array[i])) return array[i]; } return null; }

Usando: firstOrNull([{ a: 1, b: 2 }, { a: 3, b: 3 }], function(item) { return item.a === 3; });

Esta función no se ejecuta para cada elemento de la matriz (es valiosa para matrices grandes)


Creé un servicio util para mi aplicación angular. Tiene dos funciones que se usan muy a menudo.

Por ejemplo, tienes un objeto.

Primero obtener valor del objeto recursivamente sin lanzar un error indefinido.

{prop: {nestedProp1: {nestedProp2: algúnvalor}}}; obtener nestedProp2 2 sin controles indefinidos.

Segundo conjunto de filtros en base

[{prop: {nestedProp1: {nestedProp2: somevalue1}}}, {prop: {nestedProp1: {nestedProp2: somevalue2}}}];

Encuentra el objeto de la matriz con nestedProp2 = somevalue2

app.service(''UtilService'', function(httpService) { this.mapStringKeyVal = function(map, field) { var lastIdentifiedVal = null; var parentVal = map; field.split(''.'').forEach(function(val){ if(parentVal[val]){ lastIdentifiedVal = parentVal[val]; parentVal = parentVal[val]; } }); return lastIdentifiedVal; } this.arrayPropFilter = function(array, field,value) { var lastIdentifiedVal = null; var mapStringKeyVal = this.mapStringKeyVal; array.forEach(function(arrayItem){ var valueFound = mapStringKeyVal(arrayItem,field); if(!lastIdentifiedVal && valueFound && valueFound==value){ lastIdentifiedVal = arrayItem; } }); return lastIdentifiedVal; }});

Para la solución para la pregunta actual. Inyectar UtilService y llamar,

UtilService.arrayPropFilter(purposeArray,''purpose'',''daily'');

O más avanzado

UtilService.arrayPropFilter(purposeArray,''purpose.nestedProp1.nestedProp2'',''daily'');


Si su matriz es en realidad un conjunto de objetos JQuery, ¿qué hay de simplemente usar el método .filter () ?

purposeObjects.filter(''[purpose="daily"]'')


Javascript tiene una función solo para eso: Array.prototype.find . Como ejemplo

function isBigEnough(element) { return element >= 15; } [12, 5, 8, 130, 44].find(isBigEnough); // 130

No es difícil extender la devolución de llamada a una función. Sin embargo, esto no es compatible con IE (y parcialmente con Edge). Para ver una lista completa de la compatibilidad del navegador