【问题标题】:javascript recalculate deeply nested array elemnts numbersjavascript计算深度嵌套的数组元素数
【发布时间】:2020-04-02 09:57:56
【问题描述】:

我得到了以下数组:

let data =  [
        {"title": {number: 1},
            "children": [
                {"title": {number: 1.1}},
                {"title": {number: 1.2}},
                {"title": {number: 1.3}},
                {"title": {number: 1.4}},
                {"title": {number: 1.5}}
            ]
        },
        {"title": {number: 2},
            "children": [
                {"title":{number: 2.1}},
                {"title":{number: 2.2},
                    "children": [
                        {"title":{number: 2.2.1}},
                        {"title":{number: 2.2.2}},
                        {"title":{number: 2.2.3}},
                        {"title":{number: 2.2.4}} 
                    ]
                },
                {"title":{number: 2.3}},
                {"title":{number: 2.4}}
            ]
        },
        {"title": {number: 3},
            "children": []
        }
    ];

这个数组的每个元素都可以改变它的位置,可以添加新元素,可以删除现有元素。任务是重新计算元素编号以保持其正确顺序。例如,如果删除编号为2.2.2 的元素,则其他元素变为2.2.12.2.22.2.3。如果某个元素连同其子元素一起被移除,则所有其他元素的数字也应重新计算。欢迎任何想法如何做到这一点。谢谢

【问题讨论】:

  • 为什么要有数字。它们很容易从层次结构中计算出来
  • 任何想法如何从层次结构中找出它们?据我了解,我需要递归跟踪嵌套级别并为相关元素添加增量...
  • 是的,你需要递归。但正如您所见,data[0].title 是第一个标题,data[1]title 是第二个。 data[1].children[0] 是 2.1 等

标签: javascript


【解决方案1】:

您可以创建递归函数,每次对象结构发生变化时调用该函数以重新计算树中每个元素的位置。

function recalc(data, prev = '') {
  data.forEach((e, i) => {
    let dot = prev ? '.' : '';
    let number = prev + dot + (i + 1);

    if (e.children) {
      recalc(e.children, number)
    }

    if (e.title) {
      e.title.number = number
    }
  })
}

const data1 = [{"title":{"number":1},"children":[{"title":{"number":1.1}},{"title":{"number":1.2}},{"title":{"number":1.3}},{"title":{"number":1.4}},{"title":{"number":1.5}}]},{"title":{"number":2},"children":[{"title":{"number":2.1}},{"title":{"number":2.2},"children":[{"title":{"number":"2.2.1"}},{"title":{"number":"2.2.2"}},{"title":{"number":"2.2.3"}},{"title":{"number":"2.2.4"}}]},{"title":{"number":2.3}},{"title":{"number":2.4}}]},{"title":{"number":3},"children":[]}]
recalc(data1);
console.log(data1)

const data2 = [{"title":{"number":1},"children":[{"title":{"number":1.1}},{"title":{"number":1.2}},{"title":{"number":1.5}}]},{"title":{"number":2},"children":[{"title":{"number":2.1}},{"title":{"number":2.2},"children":[{"title":{"number":"2.2.3"}},{"title":{"number":"2.2.4"}}]},{"title":{"number":2.3}},{"title":{"number":2.4}}]},{"title":{"number":3},"children":[{title: {}, children: [{title: {}}, {title: {}}]}]}]
recalc(data2);
console.log(data2)

【讨论】:

    猜你喜欢
    • 2019-05-05
    • 1970-01-01
    • 1970-01-01
    • 2021-08-21
    • 1970-01-01
    • 1970-01-01
    • 2021-03-15
    • 2023-03-14
    • 1970-01-01
    相关资源
    最近更新 更多