如何从javascript对象

时间:2015-11-30 00:22:59

标签: javascript angularjs coffeescript

我有一个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.')

如何重构函数以递归方式删除所有嵌套对象和数组,以便我可以在其他地方重用它?

1 个答案:

答案 0 :(得分:2)

您可以编写一个函数来复制本身不是对象的顶级属性:

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