按属性值对对象键进行排序

时间:2021-04-26 17:32:27

标签: javascript arrays sorting ecmascript-6

我有一个包含多个条目/键的对象。每个键映射到一个包含一个或多个条目的数组。我的目标是通过在第一个位置找到的 filterGroupDisplayOrder 对 obj 中的键进行排序,并将它们返回到它们自己的数组中。示例:

想要的结果

['apple', 'kiwi', 'watermelon', 'orange', 'blueberry', 'grape'] // keys sorted by filterGroupDisplayOrder 10, 20, 30, 40, 50, 60

示例对象

const obj = {
    "apple": [
        {
            "filterGroupId": "apple",
            "filterGroupLabelKey": "Apple",
            "filterGroupDisplayOrder": 10,
        }
    ],
    "orange": [
        {
            "filterGroupId": "orange",
            "filterGroupLabelKey": "Orange",
            "filterGroupDisplayOrder": 40
        }
    ],
    "grape": [
        {
            "filterGroupId": "grape",
            "filterGroupLabelKey": "Grape",
            "filterGroupDisplayOrder": 60
        }
    ]
    "kiwi": [
        {
            "filterGroupId": "kiwi",
            "filterGroupLabelKey": "Kiwi",
            "filterGroupDisplayOrder": 20
        }
    ],
    "watermelon": [
        {
            "filterGroupId": "watermelon",
            "filterGroupLabelKey": "Watermelon",
            "filterGroupDisplayOrder": 30
        }
    ],
    "blueberry": [
        {
            "filterGroupId": "blueberry",
            "filterGroupLabelKey": "Blueberry",
            "filterGroupDisplayOrder": 50
        }
    ]
}

4 个答案:

答案 0 :(得分:1)

您可以使用 Object.keys() 获取键列表,然后使用对象的 filterGroupDisplayValues 对其进行排序。 (因为你说每个顶级键的显示顺序总是相同的,我在这里只使用了每个数组中的第一个。)

const obj = { "apple": [{ "filterGroupId": "apple", "filterGroupLabelKey": "Apple", "filterGroupDisplayOrder": 10, }], "orange": [{ "filterGroupId": "orange", "filterGroupLabelKey": "Orange", "filterGroupDisplayOrder": 40 }], "grape": [{ "filterGroupId": "grape", "filterGroupLabelKey": "Grape", "filterGroupDisplayOrder": 60 }], "kiwi": [{ "filterGroupId": "kiwi", "filterGroupLabelKey": "Kiwi", "filterGroupDisplayOrder": 20 }], "watermelon": [{ "filterGroupId": "watermelon", "filterGroupLabelKey": "Watermelon", "filterGroupDisplayOrder": 30 }], "blueberry": [{ "filterGroupId": "blueberry", "filterGroupLabelKey": "Blueberry", "filterGroupDisplayOrder": 50 }] }

const output = Object.keys(obj).sort((a, b) => {
  return obj[a][0].filterGroupDisplayOrder - obj[b][0].filterGroupDisplayOrder
})
console.log(output)

答案 1 :(得分:1)

试试运行这个:

Object.entries(obj).sort((a, b) => {return a[1][0].filterGroupDisplayOrder - b[1][0].filterGroupDisplayOrder}).map(e => e[0]);

答案 2 :(得分:0)

  • 使用 obj 从对象 Object.entries 创建一个嵌套数组。
  • 使用 filterGroupDisplayOrderArray#sort 对该嵌套数组进行排序。
  • 使用 Array#map 提取密钥。

const 
  obj={apple:[{filterGroupId:"apple",filterGroupLabelKey:"Apple",filterGroupDisplayOrder:10}],orange:[{filterGroupId:"orange",filterGroupLabelKey:"Orange",filterGroupDisplayOrder:40}],grape:[{filterGroupId:"grape",filterGroupLabelKey:"Grape",filterGroupDisplayOrder:60}],kiwi:[{filterGroupId:"kiwi",filterGroupLabelKey:"Kiwi",filterGroupDisplayOrder:20}],watermelon:[{filterGroupId:"watermelon",filterGroupLabelKey:"Watermelon",filterGroupDisplayOrder:30}],blueberry:[{filterGroupId:"blueberry",filterGroupLabelKey:"Blueberry",filterGroupDisplayOrder:50}]},
      
  res = Object.entries(obj)
    .sort(([, [a]], [, [b]]) => {
      return a.filterGroupDisplayOrder - b.filterGroupDisplayOrder;
    })
    .map(([k]) => k);

console.log(res);

答案 3 :(得分:0)

const obj={apple:[{filterGroupId:"apple",filterGroupLabelKey:"Apple",filterGroupDisplayOrder:10}],orange:[{filterGroupId:"orange",filterGroupLabelKey:"Orange",filterGroupDisplayOrder:40}],grape:[{filterGroupId:"grape",filterGroupLabelKey:"Grape",filterGroupDisplayOrder:60}],kiwi:[{filterGroupId:"kiwi",filterGroupLabelKey:"Kiwi",filterGroupDisplayOrder:20}],watermelon:[{filterGroupId:"watermelon",filterGroupLabelKey:"Watermelon",filterGroupDisplayOrder:30}],blueberry:[{filterGroupId:"blueberry",filterGroupLabelKey:"Blueberry",filterGroupDisplayOrder:50}]};

const res = Object.values(obj)
                .map(v => v[0])
                .sort((a,b) => a.filterGroupDisplayOrder - b.filterGroupDisplayOrder)
                .map(e => e.filterGroupId)

console.log(res)