2015-11-30 3 views
0

У меня есть angularjs объект входит в сферу различных вложенных объектов и массивов, как так:Как удалить все вложенные массивы и объекты из объектов JavaScript

{ 
    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.') 

Как я могу реорганизовать функцию рекурсивно удалить все вложенные объекты и массивы, так что я могу использовать его в другом месте?

ответ

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

+0

Спасибо. Очень элегантное решение. –

Смежные вопросы