移动多维数组树的深层成员 - 使用 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: [] }
]

我怎样才能:

最好使用 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/