我有一个名为“x”的对象,其格式如下:
var x = [{
name: "a",
item:[{
name: "b",
item:[{
name: "c",
item:[{
name:"f"
}]
},{
name: "d",
item:[{
name: "e"
}]
}]
}]
},{
name: "a",
item:[{
name: "b",
item:[{
name: "c"
}]
}]
}];
现在我将一些元素插入该对象内。例如:
x[0].item[0].name = "x";
x[0].item[0].item[0].name = "y";
x[0].item[0].item[0].item[0].name = "z";
所以,这是我的问题。我将三个元素插入对象内部。上面给出了代码,所有三个代码都是相似的,只是“项目”的数量发生了变化。示例:在第一个代码中,仅使用一个“项目”,在下一个代码中,使用两个“项目”,再接下来,使用三个项目。
那么,是否有任何有效的方法来创建一个通用函数来将元素推送到对象(或)内部,就像在数组中一样,我们可以像 x[0].items[[0][0]] 那样推送=“y”
。 ?
这是jsFiddle link .
最佳答案
没有错误处理的版本
初步说明:我假设您始终具有 [n]
或 [n].item[m]
结构。该算法没有任何错误处理。
所需数组的计算方式如下:取出第一个元素并获取对象。获取下一个元素,并在应用该元素之前先获取 item
属性。然后应用数组索引。重复。完成循环后,将值应用于 name
属性。
var x=[{name:"a",item:[{name:"b",item:[{name:"c",item:[{name:"f"}]},{name:"d",item:[{name:"e"}]}]}]},{name:"a",item:[{name:"b",item:[{name:"c"}]}]}];
function push(o, a, v) {
a.forEach(function (el, i) {
i && (o = o.item);
o = o[el];
});
o.name = v;
}
push(x, [0, 0, 0], 'y');
document.getElementById('out').innerHTML = JSON.stringify(x, null, 4);
<pre id="out"></pre>
具有错误处理功能的版本
假设什么都没有。如果格式不正确,当未给出属性 item
或数组索引超出范围时,它会抛出异常。
var x=[{name:"a",item:[{name:"b",item:[{name:"c",item:[{name:"f"}]},{name:"d",item:[{name:"e"}]}]}]},{name:"a",item:[{name:"b",item:[{name:"c"}]}]}];
function getReference(o, a) {
a.forEach(function (el, i) {
if (i) {
if ('item' in o) {
o = o.item;
} else {
throw new Error('No Reference (item)');
}
}
if (o[el]) {
o = o[el];
} else {
throw new Error('No Reference (index: ' + el + ')');
}
});
return o;
}
// working
try {
getReference(x, [0, 0, 0, 0]).name = 'z';
} catch (ex) {
alert(ex);
}
// throws exception 'No Reference (index: 3)'
try {
getReference(x, [0, 0, 0, 3]).name = '*';
} catch (ex) {
alert(ex);
}
document.getElementById('out').innerHTML = JSON.stringify(x, null, 4);
<pre id="out"></pre>
关于javascript - 如何使用常见方式在对象内附加元素,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31774899/