【问题标题】:Sorting nested objects对嵌套对象进行排序
【发布时间】:2019-06-25 22:48:27
【问题描述】:

我正在尝试根据 cummulativeSite 通过 object.keys 降序对 javascript 中的对象 obj 的对象进行排序,但它没有得到排序。请提出一个好的方法或方法来对它进行排序。

var obj={


 B.E:{
    A: {percentgsite: 8.5, backlogenclsite: 8.5, regularenclsite: 3.5, cummulativeSite: 20.5},
    B: {percentgsite: 5.9, backlogenclsite: 5.9, regularenclsite: 8.5, cummulativeSite: 20.3},
    C: {percentgsite: 5.9, backlogenclsite: 6.4, regularenclsite: 8.9, cummulativeSite: 21.200000000000003}
    },



 Diploma:{
    A: {percentgsite: 8.5, cummulativeSite: 5.2},
    B: {percentgsite: 5.9, cummulativeSite: 8.5},
    C: {percentgsite: 5.9, cummulativeSite: 5.6}
    },



 M.E:{
    A: {percentgsite: 8.5, cummulativeSite: 11.9},
    B: {percentgsite: 5.9, cummulativeSite: 12.9},
    C: {percentgsite: 5.9, cummulativeSite: 13.5}
    }
}

预期输出:

var obj={


 B.E:{

    C: {percentgsite: 5.9, backlogenclsite: 6.4, regularenclsite: 8.9, cummulativeSite: 21.200000000000003},
    A: {percentgsite: 8.5, backlogenclsite: 8.5, regularenclsite: 3.5, cummulativeSite: 20.5},
    B: {percentgsite: 5.9, backlogenclsite: 5.9, regularenclsite: 8.5, cummulativeSite: 20.3}
    },



 Diploma:{
    B: {percentgsite: 8.5, cummulativeSite: 8.5},
    C: {percentgsite: 5.9, cummulativeSite: 5.6},
    A: {percentgsite: 5.9, cummulativeSite: 5.2}
    },



 M.E:{
    C: {percentgsite: 8.5, cummulativeSite: 13.5},
    B: {percentgsite: 5.9, cummulativeSite: 12.9},
    A: {percentgsite: 5.9, cummulativeSite: 11.9}
    }
}

【问题讨论】:

  • 这不是一个有效的数组。 arr 是数组还是以 B.EDiplomaM.E 为键的对象?
  • 我想 B.E、Diploma 和 M.E 是独立的数组,对吗?
  • @adiga 这是一个对象
  • @WagnerdeAndradePerin 他们是对象
  • @Kris Object 不保证订单,所以你 B.E, M.E 需要数组才能订购

标签: javascript jquery sorting javascript-objects nested-object


【解决方案1】:

您可以像这样使用嵌套的Object.entriesreduce

var obj={"B.E":{A:{percentgsite:8.5,backlogenclsite:8.5,regularenclsite:3.5,cummulativeSite:20.5},B:{percentgsite:5.9,backlogenclsite:5.9,regularenclsite:8.5,cummulativeSite:20.3},C:{percentgsite:5.9,backlogenclsite:6.4,regularenclsite:8.9,cummulativeSite:21.200000000000003}},"Diploma":{A:{percentgsite:8.5,cummulativeSite:5.2},B:{percentgsite:5.9,cummulativeSite:8.5},C:{percentgsite:5.9,cummulativeSite:5.6}},"M.E":{A:{percentgsite:8.5,cummulativeSite:11.9},B:{percentgsite:5.9,cummulativeSite:12.9},C:{percentgsite:5.9,cummulativeSite:13.5}}}

const sortedObj = Object.entries(obj).reduce((acc, [dept, v]) =>{
  const sortedDept = Object.entries(v)
             .sort(([k1,v1], [k2,v2]) => v2.cummulativeSite - v1.cummulativeSite)
             .reduce((r, [k,v]) => (r[k] = v, r), {});
  
  acc[dept] = sortedDept;
  return acc;
}, {})

console.log(sortedObj)

忘了提,properties order in objects is not guaranteed in JavaScript,特别是如果你有整数keys。如果您决定将内部项目更改为数组,您就会明白。

【讨论】:

  • 如果我将 B.E、Diploma 和 M.E 作为这个对象内的数组就足够了@adiga
  • @Kris 您打算如何将“BE”转换为数组?结构是"B.E": [ { "A": { percentgsite } }, { "B": { percentgsite } } ]还是"B.E": [ { percentgsite}, { percentgsite} ]
  • 这是我将其更改为数组时的格式,我可以按照您建议的方式来实现这种情况下的排序.. @adiga
  • var obj={ BE:[ 0:{ A: {percentgsite: 8.5, backlogenclsite: 8.5, regularenclsite: 3.5, cummulativeSite: 20.5}, B: {percentgsite: 5.9, backlogenclsite: 5.9, regularenclsite :8.5,累积站点:20.3}; C: {percentgsite: 5.9, backlogenclsite: 6.4, regularenclsite: 8.9, cummulativeSite: 21.200000000000003} } ], @adiga
【解决方案2】:

正如您在 cmets 中提到的,您可以将 B.E 等更改为数组(因为对象不保证顺序)。所以我会在数组中更改它们,然后根据cummulativeSite 属性对它们进行排序

var obj={'B.E':[{A:{percentgsite:8.5,backlogenclsite:8.5,regularenclsite:3.5,cummulativeSite:20.5}},{B:{percentgsite:5.9,backlogenclsite:5.9,regularenclsite:8.5,cummulativeSite:20.3}},{C:{percentgsite:5.9,backlogenclsite:6.4,regularenclsite:8.9,cummulativeSite:21.200000000000003}}],Diploma:[{A:{percentgsite:8.5,cummulativeSite:5.2}},{B:{percentgsite:5.9,cummulativeSite:8.5}},{C:{percentgsite:5.9,cummulativeSite:5.6}}],'M.E':[{A:{percentgsite:8.5,cummulativeSite:11.9}},{B:{percentgsite:5.9,cummulativeSite:12.9}},{C:{percentgsite:5.9,cummulativeSite:13.5}}]}

Object.keys(obj).forEach(e => {
  obj[e].sort( (a,b) =>{
   return Object.values(a)[0].cummulativeSite -
   Object.values(b)[0].cummulativeSite
   })
})

console.log(obj)

【讨论】:

  • var obj={ BE:[ 0:{ A: {percentgsite: 8.5, backlogenclsite: 8.5, regularenclsite: 3.5, cummulativeSite: 20.5}, B: {percentgsite: 5.9, backlogenclsite: 5.9, regularenclsite :8.5,累积站点:20.3}; C: {percentgsite: 5.9, backlogenclsite: 6.4, regularenclsite: 8.9, cummulativeSite: 21.2000000000000003} } ],@Code Maniac 我正在以这种格式获取我的 B.E 数组。你能建议现在排序吗
  • @Kris 您发布的帖子似乎无效{ B.E: [ 0:
  • this 0 是数组存在的索引@Code Maniac
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-07-02
  • 2016-07-09
  • 2016-07-01
  • 2021-02-26
  • 1970-01-01
相关资源
最近更新 更多