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