基于同级的现有属性将新属性添加到javascript对象中

基于同级的现有属性将新属性添加到javascript对象中,javascript,arrays,sorting,lodash,Javascript,Arrays,Sorting,Lodash,假设我有一个复杂的对象数组,如下所示: [ { "title": "Fundamentals", "order": 1, "lessonRef": "fundamentals", "children": [ { "title": "History", "order": 1, "lessonRef": "history", "children": [] }, {

假设我有一个复杂的对象数组,如下所示:

[
  {
    "title": "Fundamentals",
    "order": 1,
    "lessonRef": "fundamentals",
    "children": [
      {
        "title": "History",
        "order": 1,
        "lessonRef": "history",
        "children": []
      },
      {
        "title": "NEW NODE 1",
        "lessonRef": "NEW NODE 1 STUB",
        "children": []
      },
      {
        "title": "Math",
        "order": 2,
        "lessonRef": "math",
        "children": []
      },
      {
        "title": "NEW NODE 2",
        "lessonRef": "NEW NODE 2 STUB",
        "children": []
      }
      {
        "title": "Geography",
        "order": 3,
        "lessonRef": "geography",
        "children": []
      }
    ]
  },
  {
    "title": "Basics",
    "order": 2,
    "lessonRef": "basics",
    "children": []
  }
]
我如何:

  • 遍历每个节点
  • 检测是否有一个
    新节点
    ,但没有
    顺序
    字段,并根据其在数组中的位置为其指定下一个编号
  • 然后在这之后增加所有现有的兄弟姐妹,同时
  • 是否考虑其下方新添加的任何其他节点
  • 在我开始使用纯javascript之前,我正在寻找一种lodash方法来开始


    编辑:提供了我的解决方案——在我的例子中,数组顺序是有保证的,但我将把问题扩展到顺序不保证的情况。

    如果这是您想要做的:

    var yourArray = yourDataArr
    var arr1 = []
    
    
    //fix children first
    _.each(yourArray, function(item) {
        if(item.children) item.chilren = fixArr(children)
        arr1.push(item)
    })
    
    
    //fix your array
    yourArray = fixArr(arr1)
    
    
    //fix function
    function fixArr(arr) {
    
        var res = []
        var prevOrder
    
        _.each(arr, function(item) {
    
    
            var currentOrder = item.order
    
            if(!currentOrder) {
                item.order =  prevOrder?prevOrder + 1:1
                prevOrder = item.order + 0
            }
            res.push(item)
    
        })
    
        return res
    
    }
    
    //or maybe this is you want
    function fixArrAlt(arr) {
    
        var res = []
        var order = 1
    
        _.each(arr, function(item) {
    
            item.order =  order + 0
            res.push(item)
            order ++
    
        })
    
        return res
    
    }
    

    如果这是你想做的:

    var yourArray = yourDataArr
    var arr1 = []
    
    
    //fix children first
    _.each(yourArray, function(item) {
        if(item.children) item.chilren = fixArr(children)
        arr1.push(item)
    })
    
    
    //fix your array
    yourArray = fixArr(arr1)
    
    
    //fix function
    function fixArr(arr) {
    
        var res = []
        var prevOrder
    
        _.each(arr, function(item) {
    
    
            var currentOrder = item.order
    
            if(!currentOrder) {
                item.order =  prevOrder?prevOrder + 1:1
                prevOrder = item.order + 0
            }
            res.push(item)
    
        })
    
        return res
    
    }
    
    //or maybe this is you want
    function fixArrAlt(arr) {
    
        var res = []
        var order = 1
    
        _.each(arr, function(item) {
    
            item.order =  order + 0
            res.push(item)
            order ++
    
        })
    
        return res
    
    }
    

    按照@jfriend00的建议,我只是递归地映射数组中的所有元素,并将顺序指定为索引:

    function reapplyOrder(array){
      return _.map(array, function (val, i) {
        val.order = i+1;
        if(val.children.length > 0){
          val.children = reapplyOrder(val.children);
        }
        return val;
      });  
    }
    $scope.array = reapplyOrder($scope.array);
    

    在我的例子中,数组顺序是有保证的,但我将把问题扩展到顺序不保证的情况。

    根据@jfriend00的建议,我只是递归地映射数组中的所有元素,并将顺序指定为索引:

    function reapplyOrder(array){
      return _.map(array, function (val, i) {
        val.order = i+1;
        if(val.children.length > 0){
          val.children = reapplyOrder(val.children);
        }
        return val;
      });  
    }
    $scope.array = reapplyOrder($scope.array);
    

    在我的例子中,数组顺序是有保证的,但我将把问题扩展到顺序不保证的情况。

    听起来您只是想重新分配每个订单号作为其数组位置。您所要做的就是迭代每个数组,并将order属性指定为数组位置。而且,您可以在每个子数组上进行递归。那肯定有用。让我试试。是的,那肯定管用。只是用数组位置做了一个简单的递归函数。我想我会把它放在我的问题中,如果数组顺序不能保证,我会用更新它。谢谢。这个论坛的协议是不要把答案放在你的问题上。如果您发现了一个尚未提供的答案,请将答案放入您自己的答案中(您可以回答自己的问题)。问题应该是问题。答案应该是答案。听起来您只是想重新分配每个订单号作为其数组位置。您所要做的就是迭代每个数组,并将order属性指定为数组位置。而且,您可以在每个子数组上进行递归。那肯定有用。让我试试。是的,那肯定管用。只是用数组位置做了一个简单的递归函数。我想我会把它放在我的问题中,如果数组顺序不能保证,我会用更新它。谢谢。这个论坛的协议是不要把答案放在你的问题上。如果您发现了一个尚未提供的答案,请将答案放入您自己的答案中(您可以回答自己的问题)。问题应该是问题。答案应该是答案。