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