2016-03-23 11 views
4

Dies ist mein Array von Objekten:Suchen und entfernen Sie leere Eigenschaften von Objekten

var data = [ 
    { 
    "label": "HOME", 
    "href": "web-tutor99.com", 
    "children": [{}] 
    }, 
    { 
    "href": "web-tutor99.com", 
    "label": "HTML5" 
    } 
]; 

Es ist ein mehrdimensionales Objekt und hier die Kinder Eigenschaft ist leer. Wie kann ich leere Eigenschaften wie diese finden und sie mit jQuery entfernen?

+1

was ist der Zweck, was versuchen Sie zu erreichen, indem Sie das Element entfernen? Wie ich keinen praktischen Grund sehe, warum Sie Zyklen verschwenden würden, um dieses Einzelteil zu berechnen und zu entfernen. Wenn es ist, weil es eine Display-Sache ist. Dann überprüfe einfach, ob es zuerst leer ist und dann, wenn nicht. – KyleK

+1

Ist '[{}]' ein leerer Wert für dich? –

Antwort

1

Try this

data = [{ 
 
     "label": "HOME", 
 
     "href": "web-tutor99.com", 
 
     "children": [{}] 
 
    }, { 
 
     "href": "web-tutor99.com", 
 
     "label": "HTML5" 
 
    }]; 
 

 
    alert("Before : "+JSON.stringify(data)); 
 
    //console.log(data); 
 

 
    checkEmptyObj(data); 
 

 
    alert("After : "+JSON.stringify(data)); 
 

 
    function checkEmptyObj(data) { 
 
     $.each(data, function(key, value) { 
 
     if ($.isPlainObject(value) || $.isArray(value)) { 
 
      checkEmptyObj(value); 
 
     } 
 
     //alert(key+":"+$.isEmptyObject(value)); 
 
     if (value === "" || value === null || $.isEmptyObject(value)) { 
 
      delete data[key]; 
 
     } 
 
     }); 
 

 
    }
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>

+0

danke das funktioniert. – rayees

1

Sie könnten dies tun ..

for (var i in data) { 
    if (test[i].children === null || test[i].children === undefined || test[i].children.length<=0) { 
    delete test[i].children; 
    } 
} 

Aber ich sehe keinen praktischen Einsatz in CPU-Zyklen verschwenden durch Objekte Looping leere Objekte zu entfernen.

Nicht wirklich sicher, was Sie erreichen möchten. Aber es geht Ihnen besser, wenn Sie nur nachsehen, ob es leer ist und dann nicht angezeigt wird, wenn es der Fall ist.

+3

Das würde bei seinem Beispielprojekt nicht funktionieren, da die 'children'-Eigenschaft weder 'null', noch' undefined', noch' length' von 0 ist – Aides

+0

Oh yeah du hast Recht. Habe diese zusätzlichen Klammern nicht gesehen. Mein Fehler. – KyleK

0

Sie könnten einfach eine (wenn geschachtelte, rekursive) Funktion erstellen, die alle Elemente durchläuft und überprüft, ob es einen Wert hat, falls nicht, delete diese Eigenschaft.

In Ihrem Beispiel-Objekt haben Sie das Problem, dass die children -Eigenschaft bei weitem nicht leer ist - es ist eine Eigenschaft mit einem Wert eines Arrays mit einem leeren Objekt. Abhängig von Ihrem Szenario müssten Sie Ihr Objekt mehrmals durchlaufen und leere Einträge Schritt für Schritt entfernen (könnte wahrscheinlich eine Optimierung vornehmen).

Als letzte Anmerkung können Sie for...in verwenden, um die Eigenschaften eines Objekts durchzulaufen, und for...of, um die Werte eines Objekts/Arrays zu durchlaufen.

0

Ich denke, die folgende reine JS Schnipsel Pflege der Job dauert. Sie können es überprüfen @JSBin

var data = [{"label":"HOME","href":"web-tutor99.com","children":[{}]},{"href":"web-tutor99.com","label":"HTML5"}]; 

function walkJSONObj(obj){ 
    for (var prop in obj) { 
    if (obj[prop].constructor === Array) {  //if prop is an array 
     walkJSONArray(obj[prop]);     //go walk through the arrays 
     obj[prop].length === 0 && delete obj[prop]; //if on return the array is empty delete it 
    } 
    else typeof obj[prop] === 'undefined' && delete obj[prop]; //delete undefined props 
    }  
} 

function walkJSONArray(arr){ 
    for (var l = arr.length-1; l >= 0; l--) { 
    walkJSONObj(arr[l]); // go walk the item objects 
    if (Object.keys(arr[l]).length === 0 && JSON.stringify(arr[l]) === JSON.stringify({})) { 
     arr.splice(l, 1); // if on return the object is empty delete it 
    } 
    } 
} 

walkJSONArray(data); 
Verwandte Themen