3893 Stimmen

Wie kann ich auf ein leeres JavaScript-Objekt testen?

Nach einer AJAX-Anfrage kann es vorkommen, dass meine Anwendung ein leeres Objekt zurückgibt, z. B.:

var a = {};

Wie kann ich überprüfen, ob das der Fall ist?

6voto

Reines Vanilla Javascript und volle Abwärtskompatibilität

function isObjectDefined (Obj) {
  if (Obj === null || typeof Obj !== 'object' ||
    Object.prototype.toString.call(Obj) === '[object Array]') {
    return false
  } else {
    for (var prop in Obj) {
      if (Obj.hasOwnProperty(prop)) {
        return true
      }
    }
    return JSON.stringify(Obj) !== JSON.stringify({})
  }
}

console.log(isObjectDefined()) // false
console.log(isObjectDefined('')) // false
console.log(isObjectDefined(1)) // false
console.log(isObjectDefined('string')) // false
console.log(isObjectDefined(NaN)) // false
console.log(isObjectDefined(null)) // false
console.log(isObjectDefined({})) // false
console.log(isObjectDefined([])) // false
console.log(isObjectDefined({a: ''})) // true

6voto

Ekim Punkte 953

Warnung! Beachten Sie die Beschränkungen von JSON.

javascript:
  obj={  f:function(){}  };
  alert( "Beware!! obj is NOT empty!\n\nobj = {  f:function(){}  }" + 
               "\n\nJSON.stringify( obj )\n\nreturns\n\n" +
                        JSON.stringify( obj ) );

zeigt

    Beware!! obj is NOT empty!

    obj = {  f:function(){}  }

    JSON.stringify( obj )

    returns

    {}

5voto

starikovs Punkte 3002

Ergänzend zu Thevs Antwort:

var o = {};
alert($.toJSON(o)=='{}'); // true

var o = {a:1};
alert($.toJSON(o)=='{}'); // false

es ist jquery + jquery.json

0 Stimmen

Ich verwende JSON nicht gerne, weil es nicht mit kreisförmigen Objektstrukturen arbeiten kann.

6 Stimmen

Wenn Ihre Seite jQuery lädt, verwenden Sie $.isEmptyObject() verschwenden Sie keine Zyklen mit nicht offensichtlichen Umwandlungen.

5voto

Alex Tudor Punkte 77

Die beste Ein-Zeilen-Lösung, die ich finden konnte (aktualisiert):

isEmpty = obj => !Object.values(obj).filter(e => typeof e !== 'undefined').length;

console.log(isEmpty({}))                                        // true
console.log(isEmpty({a: undefined, b: undefined}))              // true
console.log(isEmpty({a: undefined, b: void 1024, c: void 0}))   // true

console.log(isEmpty({a: [undefined, undefined]}))               // false
console.log(isEmpty({a: 1}))                                    // false
console.log(isEmpty({a: ''}))                                   // false
console.log(isEmpty({a: null, b: undefined}))                   // false

0 Stimmen

Größte Antwort übersehen

0 Stimmen

@Damien, die Frage ist 11 Jahre alt und diese Antwort wurde vor 2 Wochen veröffentlicht.

0 Stimmen

Was ist, wenn das Objekt wie folgt aussieht: { 0 : null }, erhalte ich einen Schlüssel, dessen Wert null ist. Was ist in solchen Fällen zu tun?

5voto

Dmitry Sheiko Punkte 2030

Es ist seltsam, dass ich noch keine Lösung gefunden habe, die das Objekt mit der Werte im Gegensatz zum Vorhandensein eines Eintrags (vielleicht habe ich ihn unter den vielen angegebenen Lösungen übersehen).
Ich möchte den Fall abdecken, dass ein Objekt als leer gilt, wenn alle seine Werte undefiniert sind:

    const isObjectEmpty = obj => Object.values(obj).every(val => typeof val === "undefined")

    console.log(isObjectEmpty({}))                                 // true
    console.log(isObjectEmpty({ foo: undefined, bar: undefined })) // true
    console.log(isObjectEmpty({ foo: false,     bar: null }))      // false

Beispiel für die Verwendung

Nehmen wir als Beispiel an, Sie haben eine Funktion ( paintOnCanvas ), der die Werte seines Arguments zerstört ( x , y y size ). Wenn alle undefiniert sind, sind sie aus der resultierenden Optionsliste zu streichen. Ist dies nicht der Fall, werden alle Optionen einbezogen.

function paintOnCanvas ({ brush, x, y, size }) {
  const baseOptions = { brush }
  const areaOptions = { x, y, size }
  const options = isObjectEmpty(areaOptions) ? baseOptions : { ...baseOptions, areaOptions }
  // ...
}

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X