如何从javascript对象中删除所有嵌套数组和对象
我有一个angularjs scope对象,其中包含各种嵌套对象和数组,如下所示:如何从javascript对象中删除所有嵌套数组和对象,javascript,angularjs,coffeescript,Javascript,Angularjs,Coffeescript,我有一个angularjs scope对象,其中包含各种嵌套对象和数组,如下所示: { prop1: 'prop1' prop2: 'prop2' prop3: 'prop3' nestedArray1: 0: prop1: 'prop1' prop2: 'prop2' 1: prop1: 'prop1' prop2: 'prop2' nestedObj1: prop1: 'prop1' prop
{
prop1: 'prop1'
prop2: 'prop2'
prop3: 'prop3'
nestedArray1:
0:
prop1: 'prop1'
prop2: 'prop2'
1:
prop1: 'prop1'
prop2: 'prop2'
nestedObj1:
prop1: 'prop1'
prop2: 'prop2'
nestedObj2:
prop1: 'prop1'
prop2: 'prop2'
....
}
我需要通过api保存顶级对象,目前正在使用以下coffeescript函数手动删除嵌套对象和数组,然后再将其发送到服务器:
$scope.save = ->
params = angular.copy($scope.mainObj)
delete params.nestedArray1
delete params.nestedObj2
delete params.nestedObj3
$api.update(obj: params).$promise.then ((response) ->
Flash.create('success', 'Changes saved.')
), (error) ->
Flash.create('danger', 'There\'s been a problem with our servers. Please try again later.')
如何重构函数以递归方式删除所有嵌套对象和数组,以便在其他地方重用它?您可以编写一个函数,只复制本身不是对象的顶级属性:
function copyTop(obj) {
var o = {};
for (var prop in obj) {
if (obj.hasOwnProperty(prop) && typeof obj[prop] !== "object") {
o[prop] = obj[prop];
}
}
return o;
}
这将返回一个新对象,该对象中的顶级属性本身不是嵌套对象。除非您也希望嵌套对象的顶级属性本身不是对象,否则不必递归地执行此操作,但在这种情况下,您必须指定当不同级别的属性具有相同的属性名称时要执行的操作
工作片段演示:
var数据={
方案一:“p1”,
建议2:‘p2’,
方案三:“p3”,
Nestedaray1:[
{prop1:'prop1',
prop2:'prop2'},
{prop1:'prop1',
prop2:'prop2'}
],
nestedObj1:{
prop1:‘prop1’,
prop2:‘prop2’
},
nestedObj2:{
prop1:‘prop1’,
prop2:‘prop2’
}
}
功能复印机(obj){
var o={};
用于(obj中的var prop){
if(对象hasOwnProperty(prop)和对象的类型[prop]!=“object”){
o[prop]=obj[prop];
}
}
返回o;
}
var结果=copyTop(数据);
document.write(JSON.stringify(result))代码>谢谢。非常优雅的解决方案。