我想创建一个未知对象的JSON层次结构,因此必须以递归方式处理它。
这是我的函数,其中angular.element.isEmptyObject()
继承自jQuery,angular.copy()
是一个创建对象深层副本的函数(我正在使用AngularJS)。
function recurseTree(tree, newKey, newId) {
if(angular.element.isEmptyObject(tree)) {
tree[newKey] = {_id: newId};
} else {
for(var key in tree) {
if(typeof tree[key] == 'object') recurseTree(tree[key], newKey, newId);
else tree[newKey] = {_id: newId};
}
}
return angular.copy(tree);
}
现在运行:
var testT = {};
console.log(recurseTree(testT, 'a', '1'));
console.log(recurseTree(testT, 'b', '2'));
console.log(recurseTree(testT, 'c', '3'));
console.log(recurseTree(testT, 'd', '4'));
console.log(recurseTree(testT, 'e', '5'));
您会注意到第一个和第二个按预期返回:
{
a: {
_id: '1',
b: {
_id: '2'
}
}
}
但第三个是我遇到麻烦的地方。
{
a: {
_id: '1',
b: {
_id: '2',
c: {
_id: '3'
}
},
c: {
_id: '3'
}
}
}
我需要修复哪些内容才能将c
对象作为b
的孩子附加 ONLY ,而不是a
的孩子?我很难过。
这是一个正在运行的JSFiddle,检查控制台的结果。 http://jsfiddle.net/winduptoy/Mjq5D/2/
答案 0 :(得分:3)
试试这个:
function recurseTree(tree, newKey, newId) {
if(angular.element.isEmptyObject(tree)) {
tree[newKey] = {_id: newId};
return;
}
var child = null; // find current tree's child
for(var key in tree) {
if (key != '_id') {
child = tree[key]; // found a child
break;
}
}
if (child) { // recursively process on child
recurseTree(child, newKey, newId);
} else { // no child, so just fill the tree
tree[newKey] = {_id: newId};
}
}
测试:
var testT = {};
recurseTree(testT, 'a', '1');
console.log(testT);
recurseTree(testT, 'b', '1');
console.log(testT);
recurseTree(testT, 'c', '1');
console.log(testT);
recurseTree(testT, 'd', '1');
console.log(testT);
recurseTree(testT, 'e', '1');
console.log(testT);
请注意,为了表现,我没有使用angular.copy(tree)
。
如果您不想更改树,请在将其传递给函数recurseTree
之前复制它。请在jsFiddle上试用。
答案 1 :(得分:1)
for loop
?
for(var key in tree) {
if(typeof tree[key] == 'object'){
recurseTree(tree[key], newKey, newId);
break;
}
else {
tree[newKey] = {_id: newId};
break;
}
}
答案 2 :(得分:0)
我的解决方案:
someRepository.findAll()
.stream()
.map(something -> {
//some operations
return someOtherThing;
})
.map(someOtherRepository::save)
.collect(Collectors.toList());