Javascript 在嵌套对象中查找和替换

Javascript 在嵌套对象中查找和替换,javascript,angularjs,object,multidimensional-array,Javascript,Angularjs,Object,Multidimensional Array,我正在努力解决以下问题: 我有一个嵌套对象。我从服务器上得到一个响应,其中一个对象的值发生了变化。所以我想在嵌套对象中找到对象并替换它 我的对象具有如下结构: $scope.page = { id: 5, label: 'myPage', items : [ { "type": "Container", "id": 1, "label": "header", "items": [ { "typ

我正在努力解决以下问题:

我有一个嵌套对象。我从服务器上得到一个响应,其中一个对象的值发生了变化。所以我想在嵌套对象中找到对象并替换它

我的对象具有如下结构:

$scope.page = {
  id: 5,
  label: 'myPage',
  items : [
    {
      "type": "Container",
      "id": 1,
      "label": "header",
      "items": [
        {
          "type": "Container",
          "id": 2,
          "label": "left",
          "items": [
            {
              "type": "Menu",
              "label": "settings-menu",
              "id": "5"
            },
            {
              "type": "Menu",
              "label": "main-menu",
              "id": "7"
            }
          ]
        },
        {
          "type": "Container",
          "id": 4,
          "label": "right",
          "items": [
            {
              "type": "Post",
              "label": "contact",
              "id": "25"
            }
          ]
        }
      ]
    },
    {
      "type": "Postlist",
      "label": "nieuwsberichten",
      "id": "17"
    },
    {
      "type": "HTML",
      "label": "over deze site",
      "id": "18"
    },
    {
      "type": "Other",
      "label": "twitter feed",
      "id": "19"
    }
  ]
}
从服务器上我得到一个新对象:

var newItem = {
  "type": "Post",
  "label": "contact",
  "id": "25"
}
如何以正确的方式更新$scope.page内的对象?我尝试了以下方法:

$scope.findAndReplace(newItem,$scope.page.items);

$scope.findAndReplace = function(newItem, items) {
  for (var i = 0; i < items.length; i++) {
    if (items[i].id == newItem.id) {
      items[i] = newItem;
    } else if (items[i].items) {
      $scope.findAndReplace(newItem, items[i].items);
    }
  }
}
这两种选择都不起作用。这是因为嵌套循环中的对象不再是$scope.page中的对象


有人有办法解决这个问题吗?

您的示例看起来不错,但不明白为什么它们不起作用

这两种选择都不起作用。这是因为嵌套循环中的对象不再是$scope.page中的对象


您可以使用
angular.copy(newItem,oldItem)
保持对象引用。您好,我为您创建了一把小提琴。

for(var indx=0;indx<$scope.page.items.length;indx++){
var tmpObj=$scope.page.items[indx];
if(tmpObj.hasOwnProperty('items')){
//检查内部

对于(var indx1=0;indx1您是对的。我认为这是angular的一个特定问题,但事实并非如此。如果它解决了您的问题,请不要忘记接受答案并投票……祝您好运:)我想搜索递归。在你的例子中,你必须反复编写循环,只要你的对象是深的。因此,如果我的对象是10级深的,我必须在functoid中放入10个循环
var oldItem = $scope.findById(item.id, $scope.page.items);
oldItem = newItem;

$scope.findById = function(id, items) {
  var match = null;
  angular.forEach(items, function(i){
    if (match == null) {
      if (i.id == id) {
        match = i;
      } else if (i.items) {
         match = $scope.findById(id, i.items)
      }
    }
  })
  return match;
}
    for(var indx=0; indx < $scope.page.items.length; indx++) {
    var tmpObj = $scope.page.items[indx];
  if(tmpObj.hasOwnProperty('items')) {
    // check inside
    for(var indx1=0; indx1<tmpObj.items.length; indx1++ ) {
        var innerObj = tmpObj.items[indx1];
      // check for next level
      if(innerObj.hasOwnProperty('items')) {
        for(var counter=0; counter< innerObj.items.length; counter++) {
            var thirdTmp = innerObj.items[counter];
            console.log('3rd level inner object', thirdTmp);
          if(thirdTmp.id === newItem.id) {
            innerObj.items[counter] = newItem;
            tmpObj.items[indx1] = innerObj;
            $scope.page.items[indx] = tmpObj;
          }
        }
      }

    }
  } else if(tmpObj.id === newItem.id) {
    $scope.page.items[indx] = newItem;
  }
};