【问题标题】:Adding a new property into a javascript object based on existing property of siblings根据兄弟姐妹的现有属性将新属性添加到 javascript 对象中
【发布时间】:2015-09-22 12:24:13
【问题描述】:

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

[
  {
    "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": []
  }
]

我该怎么做:

  1. 遍历每个节点,
  2. 检测到有没有order 字段的new node,并根据它在数组中的位置给它下一个数字,
  3. 然后在此之后递增每个现有的同级,同时也
  4. 考虑它下面的任何其他新添加的节点吗?

我正在寻找一种 lodash 方法来帮助我开始使用纯 JavaScript。

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

【问题讨论】:

  • 听起来您只想将每个订单号重新分配为其数组位置。您所要做的就是迭代每个数组并将 order 属性分配为数组位置。而且,您可以使其在每个子数组上递归。
  • 哇哦。那肯定会奏效。让我试试看。
  • 是的,这绝对有效。刚刚使用数组位置做了一个简单的递归函数。我想我会把它放在我的问题中,并在不能保证数组顺序的情况下更新它。谢谢。
  • 本论坛的协议是不要将答案放入您的问题中。如果您找到尚未提供的答案,请将答案放入您自己的答案中(您可以回答自己的问题)。问题应该是问题。答案应该是答案。

标签: javascript arrays sorting lodash


【解决方案1】:

如果这是你想做的:

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

}

【讨论】:

    【解决方案2】:

    按照@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);
    

    在我的情况下,数组顺序是有保证的,但我会将问题扩展到不保证顺序的情况。

    【讨论】:

      猜你喜欢
      • 2013-02-12
      • 2021-02-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-10-27
      相关资源
      最近更新 更多