Como filtrar Object usando Array.prototype.filter?
Dado
var arr = [1,2,true,4,{"abc":123},6,7,{"def":456},9,[10]]
podemos filtrar itens numéricos dentro da matrizarr
usandoNumber
construtor
var res = arr.filter(Number); // [1, 2, true, 4, 6, 7, 9, Array[1]]
estãotrue
e[10]
esperado na matriz resultante? Se substituirmosfalse
paratrue
àsarr
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]]
usandoArray.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]]
Se quisermos filtrar itens dentroarr
que são objetos, em índices4
, 7
e tentamos
var res = arr.filter(Object) // [1, 2, true, 4, Object, 6, 7, Object, 9, Array[1]]
Embora nós preferimos simplesmente chamararr.filter(Object)
, poderíamos passar uma chamada de função; tentando diferentes propriedades deObject
para que possamos encontrar uma propriedade ou método que possamos usar como função ou construtor para passar como padrãoarr.filter(/* method, constructor, other approach */)
para retornar os resultados filtrados correspondentes ao objeto, ou mesmo o nome da propriedade ou o valor do objeto na matriz de entrada.
Começamos, inocentemente, verificando se o item na matriz tem umconstructor
tendoname
igual a"Object"
var res = arr.filter(function(prop) {
return prop.constructor.name === "Object"
}) // [Object, Object]
embora quando adicionamos um objeto aarr
; por exemplo.;
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
econstructor
estãoundefined
. Embora tenhamos certeza de que isso não retornará os resultados esperados
var n = arr.filter(Object.hasOwnProperty, "abc"); // [1, 2]
pelo menos um erro não foi retornado; vamos continuar
var n = arr.filter(function(prop, val) {
return prop.hasOwnProperty(this.valueOf())
}, "abc"); // [Object abc: 123__proto__: Object]
os resultados esperados são retornados; embora estejamos tentando usar
var n = arr.filter(/* function reference */, this /* optional parameters passed */)
para
filtrar uma matriz paraObject
: {}
objetos; mesmo se o objeto não tiver um protótipo ou construtor definido; opcionalmente convertendoJSON
corda"{"abc":123}"
objetar; embora ainda não tenhamos chegado tão longe;
passar um nome de propriedade para.filter(callback, this)
padrão ondethis
serve como nome da propriedade ou valor do objeto; ou utilizar uma abordagem usandofilter.bind
, .call
ou.apply
ou outro método para filtrar um objeto da matriz de entrada - sem usar o
.filter(function(prop, value) {})
padronizar. Como podemos coagir oObject.hasOwnProperty()
chamar em um padrão semelhante ao
.filter(Object.hasOwnProperty, "abc")
?
Menção.call
, .bind
e.apply
depois de procurar uma pergunta semelhante e encontrarJS Array.prototype.filter no método de protótipo . Embora não seja certo como implementar abordagens descritas na filtragem de objetos e objetos com propriedades específicas, conforme descrito acima.
Nota, a pergunta também pode ser resolvida por umdestructuring
, ou outroes-6
, es-7
abordagem, fornecendo resultados comparáveis ou ainda mais rigorosos quando.filter()
. Ou seja, use.filter()
sem
function(prop, value) {
}
padronizar. Retornando objetos; isso éObject
, {}
; e objetos filtrados por propriedade; objetos filtrados pelo valor da propriedade.
Questões:
Como filtrar objetos com ou semObject
protótipo ou construtor dentro de uma matriz passada paraArray.prototype.filter()
sem usar uma função anônimacallback
padronizar ?
Como filtrar objetos específicos em uma matriz passada paraArray.prototype.filter()
passando o nome ou o valor da propriedade para corresponder ao objeto sem usar a função anônimacallback
padronizar ?