2017-06-28 2 views
2
var template = { 
    personal: {}, 
    education: {}, 
    certificate: [{"test": "Test"}, {}, {}], 
    experience: [] 
} 

removeEmptyObj(template); 

function removeEmptyObj(obj) 
for (var key in obj) { 
    console.log("Foor Loop" + key + " " + obj[key]); 
    if (_.isObject(obj[key]) && !_.isEmpty(obj[key])) { 
     console.log("Second Loop Object:::" + key + " " + obj[key]); 
     removeEmptyObj(obj[key]); 
    } 
    if (_.isEmpty(obj[key])) { 
     console.log("Delete Object:::" + key + " " + obj[key]); 
     obj = _.omitBy(obj, _.isEmpty); 
    } 
} 
console.log(obj); 
return obj; 
} 

Stromausgang verwendet, ist: {certificate: [{"test": "Test"}, {}, {}]}Wie leeres Objekt von JSON entfernen rekursiv lodash

gewünschte Ausgabe: {certificate: [{"test": "Test"}]}

Was Ihre Hilfe falsch hier schätzen :)

Antwort

2

Sie das Objekt rekursiv auf eine neue und saubere leere Objekte und Arrays auf dem Weg _.transform() können.

Hinweis: Ich habe mehr Elemente der Struktur zur Demonstration hinzugefügt

var template = { 
 
    personal: {}, 
 
    education: {}, 
 
    certificate: [{}, {"test": "Test"}, {}, {}, [{}], [{}, 1, []]], 
 
    experience: [[1, 2, [], { 3: [] }]] 
 
}; 
 

 
function clean(el) { 
 
    function internalClean(el) { 
 
    return _.transform(el, function(result, value, key) { 
 
     var isCollection = _.isObject(value); 
 
     var cleaned = isCollection ? internalClean(value) : value; 
 

 
     if (isCollection && _.isEmpty(cleaned)) { 
 
     return; 
 
     } 
 

 
     _.isArray(result) ? result.push(cleaned) : (result[key] = cleaned); 
 
    }); 
 
    } 
 

 
    return _.isObject(el) ? internalClean(el) : el; 
 
} 
 

 
console.log(clean(template));
<script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.4/lodash.min.js"></script>

+0

Dies lässt Lücken in Arrays. Zum Beispiel wird '[{}, {test: 1}]' '[undefiniert, {test: 1}]'. – trincot

+0

@trincot - danke für den Fang. Ich habe es überarbeitet, und jetzt wird alles rekursiv gereinigt. –

+1

ist es Arbeit wie Charme :) @OriDrori –

0

Haben Sie versucht, _. weglassen (Zertifikat, [{}]). Ich habe nie versucht, aber lassen Sie mich wissen

+0

Wie tun dies in rekursiver Weise? drioemgaoin –

+0

Sie meinen auf eine tiefe Art und Weise? Weil diese Methode alle Vorkommen auf der gleichen Ebene – drioemgaoin

+0

yaah tiefen Weg entfernen wird, wenn Sie mein O/P-Problem in nur 'Zertifikat' nicht persönlich, Bildung, Erfahrung betrachten, ist es bereits entfernen gemäß meiner Anforderung. –

1

Keine Notwendigkeit für Lashash dafür. Ein einfacher Filter reicht aus.

var template = { 
 
    personal: {}, 
 
    education: {}, 
 
    certificate: [{"test": "Test"}, {}, {}], 
 
    experience: [] 
 
} 
 

 
template.certificate = template.certificate.filter(o => Object.keys(o).length) 
 

 
console.log(template.certificate)

+0

Ich brauche rekursiv –

+0

Ich bin nicht sicher, Zertifikat ist immer leer, wie dies vielleicht auch ein anderes Objekt ist so leer persönlich, Ausbildung, Zertifikat, Erfahrung usw. rekursiv –

+0

Ah, ich folgte Ihrem aktuellen Ausgang/gewünschten Ausgang. –

1

Sie diese Funktion nutzen zu können, so dass die Unterscheidung zwischen Normal Objekte und Arrays:

// Helper function 
 
var isEmptyObject = _.overEvery(_.isObject, _.isEmpty); 
 
// Actual function 
 
function removeEmptyObj(obj) { 
 
    return _.isArray(obj) ? _.reject(_.map(obj, removeEmptyObj), isEmptyObject) 
 
      : _.isObject(obj) ? _.omitBy(_.mapValues(obj, removeEmptyObj), isEmptyObject) 
 
      : obj; 
 
} 
 

 
// Example 
 
var template = { 
 
    personal: {}, 
 
    education: {}, 
 
    certificate: [{"test": "Test"}, {}, {}], 
 
    experience: [] 
 
} 
 

 
var result = removeEmptyObj(template); 
 

 
console.log(result);
<script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.16.4/lodash.min.js"></script>

+0

Ich fühle mich ein bisschen ausgelassen: Du hast alle Antworten außer meiner kommentiert ;-) – trincot

0

Sie können diese Methode versuchen, es funktioniert für mich mit Ihrem Beispiel. Ich bin mir ziemlich sicher, dass wir in einer besseren lodash Weise tun können, aber mindestens Sie entsperren

+0

Ich überprüfe es einfach.Es funktioniert nicht, aber danke für Ihre Antwort @ dioemgaoin –

+0

Haben Sie versucht, auf das gleiche Beispiel, das Sie zur Verfügung gestellt oder etwas komplexer? Sie können uns mehr Testkontext geben, weil nur wenige Leute ein Beispiel geben, das auf unserer Seite mit Ihrem Beispiel arbeitet. – drioemgaoin

+0

Ich benutze @OriDrori Beispiel schaue ihn an Antwort –