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?
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?
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
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
{}
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
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?
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
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 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.