在嵌套对象中查找和替换

时间:2017-06-09 09:38:00

标签: javascript angularjs object multidimensional-array

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

我有一个嵌套对象。从服务器我得到一个带有更改值的对象的响应。所以我想在嵌套对象中找到对象并替换它。

我的对象有这样的结构:

rails g migration AddColumnToTable column_name:datatype ...

从服务器我得到一个新对象:

$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"
    }
  ]
}

如何以正确的方式更新$ scope.page中的对象?我尝试过以下方法:

var newItem = {
  "type": "Post",
  "label": "contact",
  "id": "25"
}

$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中的对象。

有人想要解决这个问题吗?

2 个答案:

答案 0 :(得分:0)

您的示例看起来不错,无法理解他们为什么不工作。

  

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

您可以使用angular.copy(newItem, oldItem)

保留对象引用

答案 1 :(得分:0)

嗨,我为你创造了一个小提琴。 click for fiddle

    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;
  }
};
相关问题