2016-04-28 144 views
0

我試圖做一個對象的副本,只包含不是對象的屬性。但是子對象會與它一起被複制。如何過濾所有屬性爲對象的對象?

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; 
} 

而且檢查出來這裏https://jsfiddle.net/uss94sc3/1/

+0

請注意,數組是對象,你也想刪除它們嗎? – Barmar

+0

您是否使用調試器跟蹤了您的程序?特別注意'return'行。 – 2016-04-29 01:28:42

回答

0

您返回傳入同一個對象:

return object; 

您應該返回newObject

return newObject; 
+1

Double facepalm !!謝謝。 – Person93

+0

@ Person93沒關係:)小心點 – isvforall

1

如果要嚴格地篩選出目標特性(保持nullundefined性質),那麼你不能依靠破損的typeof一元運算符。

typeof null 
// "object" 

您可以更改您的代碼:

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; 
} 
用下劃線

或更簡潔:

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

你可以試試這個

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>");