我有一个名为“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";
所以,这是我的问题。我在对象内部推了三个元素。上面给出了代码,所有三个代码都相似,只更改了“items”的数量。示例:在第一个代码中,仅使用一个“项目”,在下一个代码中使用两个“项目”,接下来是三个项目。
那么,是否有任何有效的方法来创建一个公共函数来将元素推入对象(或)中,就像在Array中一样,我们可以像x[0].items[[0][0]] = "y"
一样推送。 ?
答案 0 :(得分:2)
没有错误处理的版本
初步说明:我认为您始终拥有[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>