繁体   English   中英

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

[英]How to remove all nested arrays and objects from javascript object

我有一个带有各种嵌套对象和数组的angularjs作用域对象,如下所示:

{
  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 data = { prop1: 'p1', prop2: 'p2', prop3: 'p3', nestedArray1: [ { prop1: 'prop1', prop2: 'prop2'}, { prop1: 'prop1', prop2: 'prop2'} ], nestedObj1: { prop1: 'prop1', prop2: 'prop2' }, nestedObj2: { prop1: 'prop1', prop2: 'prop2' } } 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 result = copyTop(data); document.write(JSON.stringify(result)); 

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM