2014-11-25 64 views
-1

我想在父对象内用对象替换对象。在对象内部查找并替换对象

对象:

var obj = { 
    address: { id: 2, type: { id: 1, label: 'Test1' } }, 
    id: 1, 
    name: 'test' 
} 

选择:

var selector = "address.type"; 

新的内部对象:

var type = { id:2, label: 'Test2' } 

现在,什么是取代 “obj.address.type” 用最好的方式“类型”?

我attemtp

tmp = selector.split('.'), obj1 = obj; 
for(prop in tmp) { 
    obj1 = obj1[tmp[prop]]; 
} 
+0

为什么你在''分裂,尽管你的“选择器”使用'.'作为分隔符?你也使用错误的数组迭代模式。 – 2014-11-25 10:36:44

+0

我改正了它。但这不是问题。 – Clem 2014-11-25 10:37:46

回答

2

选择器给定为字符串,我相信。

function set(obj, selector, value) { 
    selector = selector.split("."); 
    selector.slice(0, -1).reduce(function(obj, s) { 
     return obj[s] 
    }, obj)[selector.pop()] = value; 
} 

set(obj, 'address.type.id', 'foobar'); 

如果选择是真实对象的指针,你也可以直接替换它们:

function replaceObject(obj, newObj) { 
    Object.keys(obj).forEach(function(k) { 
     delete obj[k]; 
    }); 
    Object.keys(newObj).forEach(function(k) { 
     obj[k] = newObj[k]; 
    }); 
} 

replaceObject(obj.address.type, {'foo':'bar'}); 
1

詹姆斯·唐纳利回答正确,但这里是一些简单的代码做什么,我想你想实现...如果我错过了你的目标,我很抱歉。我不知道你想用选择器变量做什么。

var objArray = [{ 
    address: { id: 2, type: { id: 1, label: 'Test1' } }, 
    id: 1, 
    name: 'test' 
},{ 
    address: { id: 4, type: { id: 3, label: 'Test2' } }, 
    id: 1, 
    name: 'test' 
},{ 
    address: { id: 6, type: { id: 5, label: 'Test3' } }, 
    id: 1, 
    name: 'test' 
}] 

var lastId=6;for (var i=0,l=objArray.length;i<l; i++){objArray[i].type={id:++lastId, label:'Test'+lastId}}; 

JSON.stringify(objArray);