Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/design-patterns/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 根据需要动态创建子对象和数组_Javascript - Fatal编程技术网

Javascript 根据需要动态创建子对象和数组

Javascript 根据需要动态创建子对象和数组,javascript,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"; // Pro

我从服务器上通过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';

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

不能真正保证跨浏览器兼容性,但试穿一下大小(适用于Chrome):

示例用法:

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

var-obj;
obj=setObj(obj,“某物”,1,“val”);
setObj(obj,“某物”,0,“某物值”);
警报(对象某物[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");
希鲁

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


这适用于极限示例。我正在寻找一个通用的解决方案,用于对象中的未限制深度。我还想做obj.some[0]。other[1]。other.value等等。这并不是你真正想要的,但是你可以稍微改变一下你的问题来反映这一点。为了做到这一点,我认为您需要一个字符串解析函数来自动创建适当的对象和数组变量。。生成的调用如下所示:parentObject=createBlueSmoke(“obj.some[0]。other[1]。other.value”,“some value”);
function setArrayObjectProp(arr, index, prop, val) {
   if (!arr[index])
       arr[index] = {};

   arr[index][prop] = val;
}

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