Bestimmen, ob alle Attribute eines Javascript-Objekts null oder eine leere Zeichenfolge sind
Lesezeit: 4 Minuten
J-bob
Was ist der eleganteste Weg, um festzustellen, ob alle Attribute in einem Javascript-Objekt entweder null oder die leere Zeichenfolge sind? Es sollte für eine beliebige Anzahl von Attributen funktionieren.
{'a':null, 'b':''} //should return true for this object
{'a':1, 'b':''} //should return false for this object
{'a':0, 'b':1} //should return false
{'a':'', 'b':''} //should return true
Egal was passiert, Sie müssen alle Elemente im Objekt durchlaufen und jedes einzelne überprüfen.
const isEmpty = Object.values(object).every(x => x === null || x === '');
const isEmpty = !Object.values(object).some(x => x !== null && x !== '');
oder kürzer: Object.values(object).every(x => !!x);
– Jonathan Meguira
29. Januar 2020 um 16:26 Uhr
@JonathanMeguira Das ist nicht das, wonach das OP fragt. Die Überprüfung auf Falsy umfasst viel mehr als eine leere Zeichenfolge oder Null.
– PVermeer
9. März 2020 um 13:47 Uhr
@abd995 Das ist nicht richtig. some und every sind gleichermaßen effizient und gleich schnell. Beide implementieren die Kurzschlussauswertung: sobald some einen Wert trifft, für den die Bedingung nicht gilt, stoppt die Iteration, ja, aber dasselbe gilt für every.
– Sebastian Simon
28. Mai 2021 um 22:22 Uhr
tymeJV
Erstellen Sie eine Funktion zum Schleifen und Überprüfen:
function checkProperties(obj) {
for (var key in obj) {
if (obj[key] !== null && obj[key] != "")
return false;
}
return true;
}
var obj = {
x: null,
y: "",
z: 1
}
checkProperties(obj) //returns false
@ J-Bob: Diese oder adeneos Antwort sollte Ihnen den Einstieg erleichtern. Wenn Sie es auch zulassen möchten undefinedändere das === null zu == null. Und Sie können oder wollen nicht hinzufügen hasOwnProperty prüfen, je nachdem, ob Ihnen Eigenschaften von Prototypen wichtig sind. (Die Antwort von adeneo überprüft nur “eigene” Eigenschaften, die von tymeJV sowohl “eigene” als auch Prototypen). Oder vielleicht eine Überprüfung, die Eigenschaften ignoriert, die sich auf Funktionen beziehen (wieder, falls gewünscht).
– TJ Crowder
30. Dezember 2014 um 17:27 Uhr
adeneo
Hier ist meine Version, die speziell auf null und leere Zeichenfolgen prüft (es wäre einfacher, nur auf Falsy zu prüfen)
function isEmptyObject(o) {
return Object.keys(o).every(function(x) {
return o[x]===''||o[x]===null; // or just "return o[x];" for falsy values
});
}
Verwenden Array.some() und überprüfen Sie, ob die Werte nicht sind null und nicht empty ist effizienter als zu verwenden Array.every und umgekehrt prüfen.
Diese Antwort sollte nur den hervorragenden Kommentar des Benutzers abd995 sichtbarer machen.
Dieser Kommentar ist jedoch falsch. Beide Methoden sind gleich effizient.
– Sebastian Simon
28. Mai 2021 um 22:29 Uhr
Sie können den Array.reduce-Prototyp für die Schlüssel Ihres Objekts verwenden.
Angenommen, das Objekt ist wie folgt aufgebaut:
var obj = {
x: null,
y: "",
z: 1
}
Sie können die folgende Anweisung verwenden, um mit nur einer Zeile festzustellen, ob alle Eigenschaften nicht festgelegt oder auf eine leere Zeichenfolge festgelegt sind:
Wenn Sie stattdessen herausfinden möchten, ob alle Eigenschaften festgelegt sind, müssen Sie die Negation vor den Bedingungen entfernen und den anfänglichen Ergebniswert nur dann auf true setzen, wenn das Objekt Schlüssel hat:
Object.keys(obj).reduce((res, k) => res && (!!obj[k] || obj[k] === false || !isNaN(parseInt(obj[k]))), Object.keys(obj).length > 0) // returns false as well
Dieser Kommentar ist jedoch falsch. Beide Methoden sind gleich effizient.
– Sebastian Simon
28. Mai 2021 um 22:29 Uhr
ajilpm
Basierend auf der Antwort von adeneo habe ich eine einzeilige Bedingung erstellt. Hoffe, es wird jemandem hilfreich sein.
Egal was passiert, Sie müssen alle Elemente im Objekt durchlaufen und jedes einzelne überprüfen.
– wmock
30. Dezember 2014 um 17:21 Uhr