2016-03-08 629 views
1

下面是一个递归方法,用于从深度嵌套数组中删除注释。代码工作,但这里是我的问题:JS | lodash:从深层嵌套数组中递归删除

问题:

  1. 我使用_.remove循环中找到和当前的数组中删除注释。由于显而易见的原因,即循环内的循环似乎很昂贵,但其他方法似乎也是昂贵的。我相信有更好的方法来做到这一点。

工作示例:

https://plnkr.co/edit/PeW5ZFLynO2q8VNqbAHx?p=preview

var comments = [ 
     { 
      id: 1, 
      depth: 0, 
      subject: 'Subject one' 
     }, 
     { 
      id: 2, 
      depth: 0, 
      subject: 'Subject two', 
      children: [ 
       { 
        id: 3, 
        depth: 1, 
        subject: 'Subject two dot one' 
       }, 
       { 
        id: 4, 
        depth: 1, 
        subject: 'Subject two dot two' 
       } 
      ] 
     }, 
     { 
      id: 5, 
      depth: 0, 
      subject: 'Subject three', 
      children: [ 
       { 
        id: 6, 
        depth: 1, 
        subject: 'Subject three dot one' 
       }, 
       { 
        id: 7, 
        depth: 1, 
        subject: 'Subject three dot two', 
        children: [ 
         { 
          id: 8, 
          depth: 2, 
          subject: 'Subject three dot two dot one' 
         }, 
         { 
          id: 9, 
          depth: 2, 
          subject: 'Subject three dot two dot two' 
         } 
        ] 
       } 
      ] 
     } 
    ]; 

    function deleteComment(comment, comments) { 
     var self = this, 
      db = []; 

     function removeComment(items, parent) { 
      _.forEach(items, function (item) { 

       // QUESTION - seems expensive as we have a loop in a loop 
       _.remove(items, function(item) { 
        if (item.id === comment.id) { 
         console.log(item); 
         return true; 
        } 
        // NOTE: use above for demo purposes 
        // return item.id === comment.id 
       }); 

       _.has(item, 'children') ? removeComment(item.children, item) : 0; 
      }); 
     } 

     removeComment(comments, db); 

    } 

    var commentToBeDeleted = {   
     id: 8, 
     depth: 2, 
     subject: 'Subject three dot two dot one' 
     }; 

    deleteComment(commentToBeDeleted, comments); 

回答

1

你也许可以找到一种方法,使用。降低()函数来.forEach和_.remove组合更有效地做到这一点。但是,如果代码正常工作,它就可以工作!

+0

谢谢凯尔,我来看看,现在你提到它,我还会看看我是否可以用_.drop做些什么。值得注意的是,问题在于,随着应用程序越来越多地写入昂贵的/编写得差的代码片段,我开始堆积起来,结束了角度消化恶梦以及整体性能问题。 – Nolan

1

我不知道这是否是完成这一任务的最高效的方式,但是这是最简洁的方式,我发现:

原来JSON.stringify提供每个回调访问JSON值被转换,这您可以使用它来确定值是否应该包含在字符串中。你可以用它来访问每个值,而不必自己遍历。

MDN

的代用品参数可以是一个函数或数组。作为 函数,它需要两个参数,密钥和值为 字符串化。提供密钥的对象是 替代者的这个参数。最初它会被一个代表被串化对象的空键 调用,然后调用 对象或数组上的每个属性被串化。应该 返回应添加到JSON字符串值,

在你的情况的功能将类似于

function deleteComment(commentToBeDeleted, comments) { 
    return JSON.parse(JSON.stringify(comments, function(key, value) { 
     if (commentToBeDeleted.id !== value.id) { 
      return value; 
     } 
    })); 
} 

注意:您可能不希望使用此代码是,因为它留下了一个空的节点,但是,你可以在回调中插入你喜欢的任何逻辑,这应该让你开始。