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ônimacallbackpadronizar ?

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 ?

questionAnswers(5)

yourAnswerToTheQuestion