我有一个从服务器通过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';
现在应该自动创建所有需要的子对象和数组。
答案 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";
}