排序对象的JS对象(嵌套)

时间:2018-10-11 19:41:40

标签: javascript object

let tags = {
    "01": {
       contentID: [10, 20],
       occurrences: 1
    },
    "02": {
       contentID: [10, 20],
       occurrences: 1
    },
    "04": {
       contentID: [10, 20],
       occurrences: 3
    },
    "05": {
       contentID: [10, 20],
       occurrences: 6
    }
};

如何通过将出现次数作为基础来按降序对它进行排序,这是一个全局变量。因此,我想将其存储在另一个对象中,并以降序对其进行排序。

3 个答案:

答案 0 :(得分:2)

您不能对对象进行排序,但是可以将其转换为值数组:

Object.values(tags).sort((a, b) => b.occurrences - a.occurrences)

结果将是:

[
  {
    contentID: [10, 20],
    occurrences: 6
  },
  {
    contentID: [10, 20],
    occurrences: 3
  },
  {
    contentID: [10, 20],
    occurrences: 1
  },
  {
    contentID: [10, 20],
    occurrences: 1
  }
]

但是,如果需要的话,也可以分别对它们进行排序:

Object.keys(tags).sort((a, b) => tags[b].occurrences - tags[a].occurrences)

您的结果将是一个数组['05', '04', '02', '01']

答案 1 :(得分:1)

请注意,javascript中的对象没有任何顺序感。

不过,您可以创建并排列以保存结果。

要按降序获取它,可以执行

Object.values(tags).sort((a,b) => b.occurrences - a.occurrences)

答案 2 :(得分:1)

将其视为数组的其他建议可能是合理的。即使有键排序规范,将Javascript对象也视为按顺序排序也不是一个好主意。但是,如果您希望将结果保持相同的格式,则可以这样做,并且仍然最终对键进行排序:

let tags = {"01": {"contentID": [10, 20], "occurrences": 1}, "02": {"contentID": [10, 20], "occurrences": 1}, "04": {"contentID": [10, 20], "occurrences": 3}, "05": {"contentID": [10, 20], "occurrences": 6}}

const sorted = Object.entries(tags).sort(([, {occurrences: a}], [, {occurrences: b}]) => b - a)
  .reduce((a, [k, v]) => Object.assign(a, {[k]: v}), {})

console.log(sorted)

不过,我看不出这到底有什么用。唯一可以看到行为差异的地方是在其上使用诸如Object.keysObject.valuesObject.entries之类的东西,再次创建数组。