¿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ónimacallbackpatró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?

Respuestas a la pregunta(5)

Su respuesta a la pregunta