首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >用另一个深嵌套的对象数组对深度嵌套的对象数组进行排序的最有效方法

用另一个深嵌套的对象数组对深度嵌套的对象数组进行排序的最有效方法
EN

Stack Overflow用户
提问于 2018-08-02 23:47:46
回答 1查看 760关注 0票数 3

例如,我已经包含了一个元素数组,它包含一个具有子类键的对象,它是对象的数组,每个对象E 29也有自己的E 110子代<代码>E 211键,其中包含另一个数组。

代码语言:javascript
复制
[
  {
    "Id": "1",
    "Children": [
      {
        "Id": "2",
        "Children": [
          {
            "Id": "10",
            "DisplayName": "3-4",
          },
          {
            "Id": "1000",
            "DisplayName": "5-6",
          },
          {
            "Id": "100",
            "DisplayName": "1-2",
          },
        ]
      }
    ]
  }
]

有一个第二个对象数组,我希望将对象的第一个数组与进行比较,目的是确保第一个数组与对象的第二个数组E 222的顺序相同,如果不是--那么e 123排序e 224,直到它是。

下面是第二个数组:

代码语言:javascript
复制
[
  {
    "Id": "1",
    "Children": [
      {
        "Id": "2",
        "Children": [
           {
            "Id": "100",
            "DisplayName": "1-2",
          },
          {
            "Id": "10",
            "DisplayName": "3-4",
          },
          {
            "Id": "1000",
            "DisplayName": "5-6",
          },
        ]
      }
    ]
  }
]

这将运行的数据可能会增加数万个,因此性能是最重要的。

我目前正在尝试的是使用实用程序方法将第二个数组的每个元素转换为对象的键控对象。

代码语言:javascript
复制
{
   1:  {
        "Id": "1",
        "Children": [
          {
            "Id": "2",
            "Children": [
              {
                "Id": "4",
                "DisplayName": "3-4",
              },
              {
                "Id": "3",
                "DisplayName": "1-2",
              },
            ]
          }
        ]
      }
}

这允许从顶层快速查找。我想知道我是否应该一直这样下去,或者是否有一种惯用的方法来完成这个任务。我也考虑过递归。已经排序的数组的顺序不是基于Id -它是任意的。因此,无论怎样,秩序都需要被保留。

EN

回答 1

Stack Overflow用户

发布于 2018-08-03 00:17:45

假设每个对象的每个级别都存在相同的深度和所有Id,则使用一个递归函数,该函数在排序回调中使用Array#findIndex()匹配

代码语言:javascript
复制
function sortChildren(main, other) {
  other.forEach((o, i) => {
    if (o.children) {
      const mChilds = main[i].children, oChilds = o.children;
      
      oChilds.sort((a, b) => {
        return mChilds.findIndex(main => main.Id === a.Id) - mChilds.findIndex(main => main.Id === b.Id)
      });
      // call function again on this level passing appropriate children arrays in
      sortChildren(mChilds, oChilds)
    }
  })
}

sortChildren(data, newData);
console.log(JSON.stringify(newData, null, ' '))
代码语言:javascript
复制
<script>
  var data = [{
    "Id": "1",
    "Children": [{
      "Id": "2",
      "Children": [{
          "Id": "3",
          "DisplayName": "1-2",
        },
        {
          "Id": "4",
          "DisplayName": "3-4",
        },
      ]
    }]
  }]

  var newData = [{
    "Id": "1",
    "Children": [{
      "Id": "2",
      "Children": [{
          "Id": "4",
          "DisplayName": "3-4",
        },
        {
          "Id": "3",
          "DisplayName": "1-2",
        },
      ]
    }]
  }]

</script>

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/51663557

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档