Wie filtere ich ein Objekt mit Array.prototype.filter?

Gegebe

var arr = [1,2,true,4,{"abc":123},6,7,{"def":456},9,[10]]

Wir können Anzahl Elemente innerhalb des Arrays filternarr usingNumber Konstrukteu

var res = arr.filter(Number); // [1, 2, true, 4, 6, 7, 9, Array[1]]

sindtrue und[10] erwartet in resultierendem Array? Wenn wir @ ersetzfalse zumtrue beimarr

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]]

usingArray.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]]

Wenn wir Elemente in @ filtern möchtarr das sind Objekte, bei Indizes4 , 7 und wir versuchen

var res = arr.filter(Object) // [1, 2, true, 4, Object, 6, 7, Object, 9, Array[1]]

Obwohl wir es vorziehen, einfach @ anzurufarr.filter(Object), wir könnten einen Funktionsaufruf übergeben; Probieren Sie verschiedene Eigenschaften vonObject, damit wir irgendwann eine Eigenschaft oder Methode finden können, die wir als Funktion oder Konstruktor verwenden können, um sie als Muster zu übergeben.arr.filter(/* method, constructor, other approach */), um die mit dem Objekt übereinstimmenden gefilterten Ergebnisse oder sogar den Eigenschaftsnamen oder den Wert des Objekts innerhalb des Eingabearrays zurückzugeben.

Wir starten unschuldig, indem wir prüfen, ob das Element im Array ein @ haconstructor mitname gleicht"Object"

 var res = arr.filter(function(prop) {
  return prop.constructor.name === "Object"
 }) // [Object, Object]

obwohl, wenn wir ein Objekt zu @ hinzufügarr; z.B.

 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`

wiec prototype undconstructor sindundefined. Obwohl wir sicher sind, dass dies nicht zu erwartenden Ergebnissen führt

var n = arr.filter(Object.hasOwnProperty, "abc"); // [1, 2]

Zumindest wurde kein Fehler zurückgegeben. lass uns weitermachen

var n = arr.filter(function(prop, val) {
          return prop.hasOwnProperty(this.valueOf())
        }, "abc"); // [Object abc: 123__proto__: Object]

die erwarteten Ergebnisse werden zurückgegeben; obwohl wir versuchen, @ zu verwend

var n = arr.filter(/* function reference */, this /* optional parameters passed */)

z

Filtern Sie ein Array nachObject : {} Objekte; auch wenn das Objekt keinen definierten Prototyp oder Konstruktor hat; optional konvertierenJSON string"{"abc":123}" zum Objekt; obwohl wir noch nicht so weit sind;

Übergeben Sie einen Eigenschaftsnamen an.filter(callback, this) Muster wothis dient als Eigenschaftsname oder Wert des Objekts; oder nutzen Sie einen Ansatz mitfilter.bind , .call oder.apply oder eine andere Methode zum Filtern eines Objekts aus dem Eingabearray - ohne Verwendung von full

.filter(function(prop, value) {})

Muster. Wie können wir das @ erzwingObject.hasOwnProperty() in ein ähnliches Muster wie @ aufruf

.filter(Object.hasOwnProperty, "abc")

?

Erwähnung.call, .bind und.apply nachdem Sie nach einer ähnlichen Frage gesucht und @ gefunden habJS Array.prototype.filter on prototype method. Es ist jedoch nicht sicher, wie die oben beschriebenen Ansätze zum Filtern von Objekten und Objekten mit bestimmten Eigenschaften implementiert werden sollen.

Hinweis, Frage kann auch durch ein @ gelöst werddestructuring , oder anderees-6, es-7 -Ansatz, der im Vergleich zu @ vergleichbare oder sogar strengere Ergebnisse liefe.filter(). Verwenden Sie also.filter() ohn

   function(prop, value) {

   }

Muster. Gegenstände zurückgeben; das istObject , {}; und nach Eigentum gefilterte Objekte; Objekte nach Eigenschaftswert gefiltert.

Fragen

Wie man Objekte mit oder ohne @ filteObject Prototyp oder Konstruktor in einem Array, das an @ übergeben wurArray.prototype.filter() ohne Verwendung einer anonymen FunktioncallbackMuster

Wie man bestimmte Objekte in einem Array filtert, das an @ übergeben wurArray.prototype.filter() durch Übergabe des Eigenschaftsnamens oder -werts an ein Objekt ohne Verwendung einer anonymen Funktioncallback Muster

Antworten auf die Frage(12)

Ihre Antwort auf die Frage