移动多维数组树的深层成员 - 使用 lodash 或下划线
Moving a deep-set member of a multidimensional array tree - using lodash or underscore
我想使用 lodash 或等效代码移动树的深度集成员。
示例树
[
{ id: 32, name: 'unique name', children: [] },
{ id: 43, name: 'unique name', children: [] },
{ id: 55, name: 'unique name', children: [
{ id: 31, name: 'unique name', children: [] },
{ id: 63, name: 'unique name', children: [] },
{ id: 84, name: 'unique name', children: [
{ id: 47, name: 'unique name', children: [] },
{ id: 56, name: 'unique name', children: [] }
] }
] }
{ id: 67, name: 'unique name', children: [
{ id: 78, name: 'unique name', children: [] },
{ id: 89, name: 'unique name', children: [] },
] },
{ id: 30, name: 'unique name', children: [] }
]
我怎样才能:
- 找到id为47的特定对象
- 将该对象(id:47)移动到树的新级别
最好使用 lodash。树可以无限深。
编辑 作为对所选答案的回应,我重新编写了代码以更准确地符合我的问题描述:https://jsfiddle.net/j88vencp/4/
IF 你可以稍微改变你的树的结构它必须更容易按照你想要的方式操作:
var collection = {
32 : { id: 32, name: 'unique name', children: {} },
43: { id: 43, name: 'unique name', children: {} },
55: { id: 55, name: 'unique name', children: {
31: { id: 31, name: 'unique name', children: {} },
63: { id: 63, name: 'unique name', children: {} },
84: { id: 84, name: 'unique name', children: {
47: { id: 47, name: 'unique name', children: {} },
56: { id: 56, name: 'unique name', children: {} },
} },
} }
}
function moveElement(el, obj) {
var newEl = el;
var id = el.id;
// do removing and moving stuff here
console.log(newEl);
// remove from collection
_.omit(obj, el.id);
// add to collection in upper tree
obj[id] = newEl;
console.log(obj);
}
function deepSearch(obj, origobj, val) {
for (var key in obj) {
if (obj.hasOwnProperty(key)) {
var el = obj[key];
if (_.size(el.children) > 0) {
deepSearch(el.children, origobj, val);
}
if (key == val) {
moveElement(el, origobj);
return;
}
}
}
}
deepSearch(collection, collection, 56);
这里有一个 fiddle --> https://jsfiddle.net/j88vencp/4/
我想使用 lodash 或等效代码移动树的深度集成员。
示例树
[
{ id: 32, name: 'unique name', children: [] },
{ id: 43, name: 'unique name', children: [] },
{ id: 55, name: 'unique name', children: [
{ id: 31, name: 'unique name', children: [] },
{ id: 63, name: 'unique name', children: [] },
{ id: 84, name: 'unique name', children: [
{ id: 47, name: 'unique name', children: [] },
{ id: 56, name: 'unique name', children: [] }
] }
] }
{ id: 67, name: 'unique name', children: [
{ id: 78, name: 'unique name', children: [] },
{ id: 89, name: 'unique name', children: [] },
] },
{ id: 30, name: 'unique name', children: [] }
]
我怎样才能:
- 找到id为47的特定对象
- 将该对象(id:47)移动到树的新级别
最好使用 lodash。树可以无限深。
编辑 作为对所选答案的回应,我重新编写了代码以更准确地符合我的问题描述:https://jsfiddle.net/j88vencp/4/
IF 你可以稍微改变你的树的结构它必须更容易按照你想要的方式操作:
var collection = {
32 : { id: 32, name: 'unique name', children: {} },
43: { id: 43, name: 'unique name', children: {} },
55: { id: 55, name: 'unique name', children: {
31: { id: 31, name: 'unique name', children: {} },
63: { id: 63, name: 'unique name', children: {} },
84: { id: 84, name: 'unique name', children: {
47: { id: 47, name: 'unique name', children: {} },
56: { id: 56, name: 'unique name', children: {} },
} },
} }
}
function moveElement(el, obj) {
var newEl = el;
var id = el.id;
// do removing and moving stuff here
console.log(newEl);
// remove from collection
_.omit(obj, el.id);
// add to collection in upper tree
obj[id] = newEl;
console.log(obj);
}
function deepSearch(obj, origobj, val) {
for (var key in obj) {
if (obj.hasOwnProperty(key)) {
var el = obj[key];
if (_.size(el.children) > 0) {
deepSearch(el.children, origobj, val);
}
if (key == val) {
moveElement(el, origobj);
return;
}
}
}
}
deepSearch(collection, collection, 56);
这里有一个 fiddle --> https://jsfiddle.net/j88vencp/4/