2011-12-31 78 views
2

我有一个通过AJAX通过AJAX从服务器创建的对象。该对象有几个子对象的数组,例如:需要时动态创建子对象和数组

obj.subObj1[0].value="abc"; 
obj.subObj1[1].value="abc"; 
obj.subObj2[0].value="abc"; 

现在我想在这种对象设置一些值,但我不知道他们是否已经存在。

obj.subObj1[0].value="new Value"; // No Problem 
obj.subObj2[1].value="new Value2"; // Problem because obj.subObj2[1] is no Object. 

我需要做的第一obj.subObj2[1]={}

因为我经常遇到这个问题,所以我正在寻找使这个自动化的方法。一种方法或类,它会自动创建所需的对象(如果我使用整数,则为数组)。

它应该能够处理这种子对象的无限深度。像这样:

var obj = TheObject(); 
obj.sub1.sub2[10].sub3[1].sub4='value'; 

现在自动创建所有需要的子对象和数组。

回答

1

真的不能保证有关跨浏览器兼容任何东西,但如何在尝试这种尺寸为(在Chrome作品):

// Safely sets value property of index of an array of an object. 
function setObj(obj, subObjName, index, val) { 
    // Ensure the object exists 
    if (typeof obj == 'undefined') { 
     obj = new Object(); 
    } 

    // Ensure the array property exists 
    if (typeof obj[subObjName] == 'undefined') { 
     obj[subObjName] = new Array(); 
    } 

    // Ensure the array properties index exists 
    if (typeof obj[subObjName][index] == 'undefined') { 
     obj[subObjName][index] = {}; 
    } 

    // Set the value 
    obj[subObjName][index].value = val; 

    // Return the object 
    return obj; 
} 

使用例:

<script type="text/javascript"> 
    var obj; 
    obj = setObj(obj, "something", 1, "val"); 
    setObj(obj, "something", 0, "someValue"); 
    alert(obj.something[1].value); 
    alert(obj.something[0].value); 
</script> 
+0

+1 nice answer :) – Marwan 2011-12-31 11:22:08

+0

这适用于极限示例。我正在寻找一个通用的解决方案,用于对象中的无限深度。我也想做 obj.some [0] .other [1] .another.value 等等。 – 2011-12-31 12:56:16

+0

这实际上并不是你问的,但你可以稍微改变你的问题以反映这一点。为了做这样的事情,我会想象你需要一个字符串解析函数来自动创建适当的对象和数组变量。结果调用看起来像这样:parentObject = createBlueSmoke(“obj.some [0]。其他[1] .another.value“,”某个值“); – abelito 2011-12-31 13:14:56

0

如果可以假设数组中的被引用的项目将会是未定义的,或者它是简化事物的对象。当然,简单(非自动)的方法是这样的:

if (!obj.subObj2[1]) obj.subObj2[1] = {}; 
obj.subObj2[1].value = "new Value2"; 

一个不是非常通用的函数来为你做它应该是:

function setArrayObjectProp(arr, index, prop, val) { 
    if (!arr[index]) 
     arr[index] = {}; 

    arr[index][prop] = val; 
} 

// called as 
setArrayObjectProp(obj.subObj2, 1, "value", "new Value2"); 
0

heloo

试首先测试数组项目的类型,如果它不是对象然后等于它新的对象格式{value:“new Value2”}

if(typeof(obj.subObj2[1])!='object') 
{ 
obj.subObj2[1] = {value:"new Value2"}; 
} 
else 
{ 
obj.subObj2[1].value = "new Value2"; 
}