【问题标题】:How to sort through complex object by key如何按键排序复杂对象
【发布时间】:2022-01-08 07:02:50
【问题描述】:

鉴于我的对象的特殊性质,我一直在努力寻找有用的资源...我想简单地按字母顺序对对象进行排序,但我需要按我的键排序。

这是一个示例对象,它与我正在使用的对象具有相同的架构

{
     "sections": [
         {
           "title": "21Q4 Results",
           "states": {
                        "Maine": {
                                   "string1":[{stuff1}],
                                   "string2":[{stuff2}],                
                                 },
                        "Arkansas": {
                                   "string1":[{stuff1}],
                                   "string2":[{stuff2}],                
                                 },
                        "Kentucky": {
                                   "string1":[{stuff1}],
                                   "string2":[{stuff2}],                
                                 },
                      }
         }
                 ]
}

目标是按字母顺序排列sections.states。不幸的是,这个对象的结构是由我无法控制的 API 生成的,因此从后端更改结构并不是一个真正的选择。

实现这一目标的最佳方法是什么?任何帮助将不胜感激。

【问题讨论】:

  • 这能回答你的问题吗? Sorting arrays in javascript by object key value
  • 也许我不明白,但你不能对对象内的对象键进行排序。您需要创建一个状态列表并对它们进行排序。 Object是一个hashmap数据结构,这意味着即使是js引擎也无法保证key的顺序
  • @Kinglish - 不幸的是,该特定方法不适用于对象 - 但数组仅适用于 results.states 不可用。这就是为什么我一直在努力寻找资源来帮助解决这个特定问题。
  • @captain-yossarian 实际上,对象是在一些 Vue 元素中渲染的,并且由于它们是循环的,首先对它们进行排序将允许我们按字母顺序显示它们。
  • 可以考虑js Map developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/… 。它使键保持插入顺序。

标签: javascript json typescript


【解决方案1】:

这是一种将状态对象转换为排序数组以保持排序顺序的方法。

let stuff1 = stuff2 = 'foobar'
let data = {
  "sections": [{
    "title": "21Q4 Results",
    "states": {
      "Maine": {
        "string1": [{ stuff1 }], "string2": [{ stuff2 }],
      },
      "Arkansas": {
        "string1": [{ stuff1 }], "string2": [{ stuff2 }],
      },
      "Kentucky": {
        "string1": [{ stuff1 }], "string2": [{ stuff2 }],
      },
    }
  }]
}

let newstates = Object.keys(data.sections[0].states).sort((a, b) => a.localeCompare(b)).map(s => ({state: s, data: data.sections[0].states[s] }));
console.log(newstates)

【讨论】:

    猜你喜欢
    • 2019-07-02
    • 2016-09-27
    • 2011-09-04
    • 2012-11-03
    • 2023-01-19
    • 1970-01-01
    • 2023-02-03
    • 2020-12-04
    • 1970-01-01
    相关资源
    最近更新 更多