2014-11-25 68 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);