在需要时动态创建子对象和数组

时间:2011-12-31 10:57:45

标签: javascript

我有一个从服务器通过AJAX从JSON创建的对象。该对象在数组中有几个子对象,例如:

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

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

3 个答案:

答案 0 :(得分: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>

答案 1 :(得分: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");

答案 2 :(得分:0)

heloo

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

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