Bestimmen, ob alle Attribute eines Javascript-Objekts null oder eine leere Zeichenfolge sind

Lesezeit: 4 Minuten

Benutzer-Avatar
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.

    – wmock

    30. Dezember 2014 um 17:21 Uhr

Benutzer-Avatar
PVermeer

Überprüfen Sie alle Werte mit Object.values. Es gibt ein Array mit den Werten zurück, mit denen Sie es überprüfen können Array.prototype.every oder Array.prototype.some:

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

Benutzer-Avatar
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


Benutzer-Avatar
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
    });
}

let obj = { x: null, y: "hello", z: 1 };
let obj1 = { x: null, y: "", z: 0 };

!Object.values(obj).some(v => v);
// false

!Object.values(obj1).some(v => v);
// true

Benutzer-Avatar
Dämon

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.

const isEmpty = !Object.values(object).some(x => (x !== null && x !== ''));

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:

Object.keys(obj).reduce((res, k) => res && !(!!obj[k] || obj[k] === false || !isNaN(parseInt(obj[k]))), true) // returns false

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

Benutzer-Avatar
ajilpm

Basierend auf der Antwort von adeneo habe ich eine einzeilige Bedingung erstellt. Hoffe, es wird jemandem hilfreich sein.

var test = {
  "email": "[email protected]",
  "phone": "1234567890",
  "name": "Test",
  "mobile": "9876543210",
  "address": {
      "street": "",
      "city": "",
      "state": "",
      "country": "",
      "postalcode": "r"
  },
  "website": "www.test.com"
};

if (Object.keys(test.address).every(function(x) { return test.address[x]===''||test.address[x]===null;}) === false) {
   console.log('has something');
} else {
   console.log('nothing');
}

Sie können es testen https://jsfiddle.net/4uyue8tk/2/

1146480cookie-checkBestimmen, ob alle Attribute eines Javascript-Objekts null oder eine leere Zeichenfolge sind

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy