如何使用常用方法在对象中追加元素

时间:2015-08-02 18:00:25

标签: javascript jquery

我有一个名为“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"一样推送。 ?

这是jsFiddle link

1 个答案:

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