2014-09-24 133 views
0

我有对象的数组(任意深度的)具有相同属性:在对象的数组更改属性

var array = [], 
    i; 

for(i = 0; i < 4; i++) { 
    array.push({ 
     'a': '0', 
     'b': { 
      'c': '0' 
     } 
    }); 
} 

我想的功能设置为特定值的属性在像这样的所有对象:

// only to demonstrate, doesn't actually work! 
function set(array, attribute, value) { 
    array.forEach(function(obj) { 
     obj[attribute] = value; 
    }); 
} 

为了能够使用这样的(或类似):

set(array, 'a', 1); 
set(array, 'b.c', 5); 

如果你无法理解我的问题,请帮我澄清一下。先谢谢你!

解决方案

我解决了它,但无法发布一个答案所以在这里,它是:

function set(array, attribute, value) { 
    // a.b.c => [a, b, c] 
    attribute = attribute.split('.'); 

    array.forEach(function(obj) { 
     // obj = array[index] 
     for (i = 0; i < attribute.length - 1; i++) { 
      // i = 0) obj = array[index].a 
      //  1) obj = array[index].a.b 
      obj = obj[attribute[i]]; 
     } 

     // array[index].a.b.c = value 
     obj[attribute[i]] = value; 
    }); 
} 
+0

那么你面临的问题是什么? – mithunsatheesh 2014-09-24 17:14:57

+1

重复的http://stackoverflow.com/q/13719593/1529630 – Oriol 2014-09-24 18:02:02

+0

我无法发布答案,所以我现在就把我的解决方案放在问题中。 – 2014-09-24 20:58:59

回答

0
var array = [], 
    i; 

for(i = 0; i < 4; i++) { 
    array.push({ 
     'a': '0', 
     'b': { 
      'c': '0' 
     } 
    }); 
} 

set = function(array, key, value){ 
    for (i = 0; i < array.length; i++){ 
    array[i][key] = value; 
    } 
} 

set(array, "test", "Test"); 
alert(array[0]['test']); 

哈,@Oriol是正确的,你只需要在你原来的语法错误功能可按。

+0

这对'b.c'不起作用 – Bergi 2014-09-24 18:07:07