¿Cómo filtrar objetos usando Array.prototype.filter?
Dado
var arr = [1,2,true,4,{"abc":123},6,7,{"def":456},9,[10]]
podemos filtrar elementos numéricos dentro de la matrizarr
utilizandoNumber
constructor
var res = arr.filter(Number); // [1, 2, true, 4, 6, 7, 9, Array[1]]
sontrue
y[10]
esperado en la matriz resultante? Si sustituimosfalse
paratrue
aarr
var arr = [1,2,false,4,{"abc":123},6,7,{"def":456},9,[10]]
var res = arr.filter(Number) // [1, 2, 4, 6, 7, 9, Array[1]]
utilizandoArray.isArray
var res = arr.filter(Array.isArray) // [Array[1]]
String
var res = arr.filter(String) // [1, 2, true, 4, Object, 6, 7, Object, 9, Array[1]]
Si queremos filtrar elementos dentro dearr
que son objeto, en índices4
, 7
y tratamos
var res = arr.filter(Object) // [1, 2, true, 4, Object, 6, 7, Object, 9, Array[1]]
Aunque preferiríamos simplemente llamararr.filter(Object)
, podríamos pasar una llamada de función; probando diferentes propiedades deObject
para que eventualmente podamos encontrar una propiedad o método que podamos usar como función o constructor para pasar como patrónarr.filter(/* method, constructor, other approach */)
para devolver los resultados filtrados que coinciden con el objeto, o incluso el nombre de propiedad o el valor del objeto dentro de la matriz de entrada.
Comenzamos, inocentemente, comprobando si el elemento en la matriz tiene unconstructor
teniendoname
igual a"Object"
var res = arr.filter(function(prop) {
return prop.constructor.name === "Object"
}) // [Object, Object]
aunque cuando agregamos un objeto aarr
; p.ej.;
var c = Object.create(null); arr.push(c);
var res = arr.filter(function(prop) {
return prop.constructor.name === "Object"
}) // `Uncaught TypeError: Cannot read property 'name' of undefined`
comoc
prototype
yconstructor
sonundefined
. Aunque estamos seguros de que esto no devolverá los resultados esperados
var n = arr.filter(Object.hasOwnProperty, "abc"); // [1, 2]
al menos no se devolvió un error; sigamos
var n = arr.filter(function(prop, val) {
return prop.hasOwnProperty(this.valueOf())
}, "abc"); // [Object abc: 123__proto__: Object]
se devuelven los resultados esperados; aunque estamos tratando de usar
var n = arr.filter(/* function reference */, this /* optional parameters passed */)
a
filtrar una matriz paraObject
: {}
objetos; incluso si el objeto no tiene un prototipo o constructor definido; opcionalmente convirtiendoJSON
cuerda"{"abc":123}"
al objeto; aunque todavía no hemos llegado tan lejos;
pasar un nombre de propiedad a.filter(callback, this)
patrón dondethis
sirve como nombre de propiedad o valor del objeto; o utilizar un enfoque usandofilter.bind
, .call
o.apply
u otro método para filtrar un objeto de la matriz de entrada, sin usar full
.filter(function(prop, value) {})
modelo. ¿Cómo podemos obligar alObject.hasOwnProperty()
llamar a un patrón similar a
.filter(Object.hasOwnProperty, "abc")
?
Mencionando.call
, .bind
y.apply
después de buscar una pregunta similar y encontrarJS Array.prototype.filter en método prototipo . Aunque no está seguro de cómo implementar los enfoques descritos en el filtrado de objetos y objetos que tienen propiedades específicas como se describió anteriormente.
Nota, la pregunta también puede ser resuelta por undestructuring
, u otroes-6
, es-7
enfoque, proporcionando resultados comparables o incluso más estrictos, en comparación con.filter()
. Es decir, usar.filter()
sin
function(prop, value) {
}
modelo. Devolver objetos; es decirObject
, {}
; y objetos filtrados por propiedad; objetos filtrados por valor de propiedad.
Preguntas:
Cómo filtrar objetos con o sinObject
prototipo o constructor dentro de una matriz pasada aArray.prototype.filter()
sin usar una función anónimacallback
patrón?
Cómo filtrar objetos específicos dentro de una matriz pasada aArray.prototype.filter()
pasando el nombre o el valor de la propiedad para que coincida con el objeto sin usar la función anónimacallback
patrón?