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 Funktioncallback
Muster
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