如何从javascript对象中删除所有嵌套数组和对象

如何从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

我有一个angularjs scope对象,其中包含各种嵌套对象和数组,如下所示:

{
  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))谢谢。非常优雅的解决方案。