2016-04-28 6 views
0

Ich versuche, eine Kopie eines Objekts zu erstellen, das nur die Eigenschaften enthält, die keine Objekte sind. Aber die Kindobjekte werden mitkopiert.Wie kann ich ein Objekt aller Objekte filtern, die Objekte sind?

var testObject = { 
    stringProperty: "hi", 
    intProperty: 4, 
    objectProperty: {}, 
    nullProperty: null 
}; 

console.log(removeChildObjects(testObject)); 

function removeChildObjects(object) { 
    var keys = Object.keys(object); 
    var newObject = {}; 
    keys.forEach(function(key) { 
    console.log(key, object[key], typeof object[key]); 
    if (typeof object[key] != "object") { 
     newObject[key] = object[key]; 
    } 
    }); 
    return object; 
} 

Auch es hier ansehen https://jsfiddle.net/uss94sc3/1/

+0

Beachten Sie, dass Arrays Objekte sind, möchten Sie sie auch entfernen? – Barmar

+0

Haben Sie Ihr Programm mit einem Debugger verfolgt? Achten Sie besonders auf die "Return" -Linie. –

Antwort

0

Sie gelangen wieder auf das gleiche Objekt, das übergeben:

return object; 

Sie newObject

return newObject; 
+1

Doppelte Facepalm !! Vielen Dank. – Person93

+0

@ Person93 Es ist OK :) sei vorsichtig – isvforall

1

Wenn Sie Objekteigenschaften wollen streng (halten null und undefined Eigenschaften herauszufiltern zurückgeben sollte), dann können Sie sich nicht auf den gebrochenen typeof unären Operator verlassen.

typeof null 
// "object" 

können Sie entweder Ihren Code ändern:

function removeChildObjects(object) { 
    var keys = Object.keys(object); 
    var newObject = {}; 
    keys.forEach(function(key) { 
     if (typeof object[key] != "object" || object[key] == null) { 
      newObject[key] = object[key]; 
     } 
    }); 
    return newObject; 
} 

oder kurz und bündig mit Strich:

function removeChildObjects(object) { 
    return _.omit(object, _.isObject); 
} 
0

Sie können versuchen, diese

var testObject = { 
 
        stringProperty: "hi", 
 
        intProperty: 4, 
 
        objectProperty: {}, 
 
        nullProperty: null 
 
       }; 
 
var filterPrimitive = o => Object.keys(o).reduce((p,k) => {typeof o[k] != "object" && (p[k] = o[k]); return p},{}); 
 

 
document.write("<pre>" + JSON.stringify(filterPrimitive(testObject),null,2) + "</pre>");

Verwandte Themen