Javascript 如何在嵌套对象中添加指定级别的项?

Javascript 如何在嵌套对象中添加指定级别的项?,javascript,tree,Javascript,Tree,我对javascript中的嵌套对象有问题。我想生成,比方说,对象树。例如,我有这样的树: var tree = { item1: { item11: {}, item12: {} }, item2: { item21: { item211: {}, item212: {} } } } 现在我有了字符串中的路径(比如item1.item11),我想使用

我对javascript中的嵌套对象有问题。我想生成,比方说,对象树。例如,我有这样的树:

var tree = {
    item1: {
        item11: {},
        item12: {}
    },
    item2: {
        item21: {
            item211: {},
            item212: {}
        }
    }
}
现在我有了字符串中的路径(比如
item1.item11
),我想使用
path
item11
放到
树中

调用
treePush
函数后,我希望:

var tree = {
    item1: {
        item11: {
            item111: {}
        },
        item12: {}
    },
    item2: {
        item21: {
            item211: {},
            item212: {}
        }
    }
}
现在我有了这段代码,但这会将新项目放入
树的根目录中,而不是指定的级别:

//use example: treePush('item1.item11', 'item111', tree);

function treePush(path, value, tree) {
    var branch = getBranch(path, tree);

    branch[value] = {};
    $.extend(tree, branch);

    return tree;
}

function search(key, tree) {
    //searches key in tree and generates path like 'item1.item11'
}

function getBranch(path, tree) {
    var keys = path.split('.'),
        obj = tree,
        branch = {};

    for(var i = 0; i < keys.length - 1; i++) {
        var key = keys[i];

        if (obj[key] === undefined) {
            return {};
        }

        branch[key] = obj[key]; 
        obj = obj[key];
    }

    return branch;
};
//使用示例:treePush('item1.item11','item111','item111',tree);
函数treePush(路径、值、树){
var branch=getBranch(路径,树);
分支[值]={};
$.extend(树、树枝);
回归树;
}
函数搜索(键、树){
//在树中搜索键并生成类似“item1.item11”的路径
}
函数getBranch(路径、树){
var keys=path.split('.'),
obj=树,
分支={};
对于(变量i=0;i

我认为问题出在
treePush
函数(
branch[value]={};
)的第5行,但我无法让它工作。感谢您的帮助。

请使用以下命令:

Object.byString = function(o, s) {
    s = s.replace(/\[(\w+)\]/g, '.$1'); // convert indexes to properties
    s = s.replace(/^\./, '');           // strip a leading dot
    var a = s.split('.');
    while (a.length) {
        var n = a.shift();
        if (n in o) {
            o = o[n];
        } else {
            return;
        }
    }
    return o;
}


Object.byString(tree, 'item1.item11')['item111'] = {};
jsidle工作示例


找到Object.byString。

如您所述,您希望选择路径“item1.item11”并将给定的“item111”推入其中。要使其工作,您必须指定要推送的键/值,或者只给它一个对象并在给定路径中混合该对象。mixin方法需要jQuery来实现$.extend方法,我不太喜欢这种方法(依赖jQuery来完成这个简单的任务)

这是两个版本

jquerymixin版本 在路径中指定目标键
你能举一个例子,说明传递到
treePush()
键和
值的参数吗?因为我不知道对象的键,所以它们是动态创建的。
var tree = {
    item1: {
        item11: {},
        item12: {}
    },
    item2: {
        item21: {
            item211: {},
            item212: {}
        }
    }
};

function treePush (tree, path, item) {
    var key, branch = tree;
    path = path.split('.');
    while (path.length) {
        key = path.shift();
        branch = branch[key] = branch[key] || {};
    }
    $.extend(branch, item);
}

treePush(tree, 'item1.item11', {item111: 'value'});
console.log(tree.item1.item11.item111 === 'value');
var tree = {
    item1: {
        item11: {},
        item12: {}
    },
    item2: {
        item21: {
            item211: {},
            item212: {}
        }
    }
};

function treePush (tree, path, value) {
    var key, branch = tree;
    path = path.split('.');
    while (path.length > 1) {
        key = path.shift();
        branch = branch[key] = branch[key] || {};
    }
    branch[path.shift()] = value;
}

treePush(tree, 'item1.item11.item111', 'value');
console.log(tree.item1.item11.item111 === 'value');