【问题标题】:How to sort map entries according to the values [duplicate]如何根据值对地图条目进行排序[重复]
【发布时间】:2018-03-29 15:42:56
【问题描述】:

我在下面的代码部分发布了地图。我想要实现的是,根据值升序对地图进行排序。这样,在排序之后, 我应该按照上一节所示对地图进行排序。

请告诉我如何实现。

代码

const map = {};
map['test.truck'] = 10;
map['test.domain'] = -20;
map['test.institute'] = 0;
map['test.vehicle'] = 40;
map['test.lan'] = 1;
map['test.wifi'] = 9;

排序后

map['test.domain'] = -20;
map['test.institute'] = 0;
map['test.lan'] = 1;
map['test.wifi'] = 9;
map['test.truck'] = 10;
map['test.vehicle'] = 40;

【问题讨论】:

  • 对象属性不能这样排序。
  • 您可以通过Object.keys(map).sort((a,b) => map[a] > map[b])轻松获取排序后的键,但无法对对象属性进行排序

标签: javascript node.js javascript-objects


【解决方案1】:

你可以这样做:

const map = {};
map['test.truck'] = 10;
map['test.domain'] = -20;
map['test.institute'] = 0;
map['test.vehicle'] = 40;
map['test.lan'] = 1;
map['test.wifi'] = 9;

const mapSorted = Object
  .keys(map)
  .sort((a, b) => map[a] - map[b])
  .reduce((a, c) => (a[c] = map[c], a), {});

console.log(mapSorted);

【讨论】:

  • 谢谢。现在,如果我有一张包含 {object, Number} 的地图,我可以使用您发布的代码对其进行排序吗?或者该代码仅在密钥是字符串时才适用?请指教
【解决方案2】:

首先,一个重要的区别:您使用的是对象,而不是地图。 JavaScript 有一个单独的 Map 类。

无论如何,您所要求的都是不可能的。地图条目没有内部顺序;当您遍历它们时,完全由 JavaScript 实现决定返回它们的顺序。

【讨论】:

    【解决方案3】:

    您要做的是按属性值对对象进行排序。

    例子:

    const list = {"you": 100, "me": 75, "foo": 116, "bar": 15};
    const listSorted = Object.keys(list)
           .sort((a, b) => list[a]-list[b])
           .reduce((obj, key) => ({
             ...obj, 
             [key]: list[key]
           }), {})
    

    【讨论】:

      【解决方案4】:

      你应该使用这些库。

      https://www.npmjs.com/package/treemap-js

      【讨论】:

        【解决方案5】:

        您必须先转换为数组,然后再排序:

        function sortProperties(obj)
        {
          // convert object into array
            var sortable=[];
            for(var key in obj)
                if(obj.hasOwnProperty(key))
                    sortable.push([key, obj[key]]); // each item is an array in format [key, value]
        
            // sort items by value
            sortable.sort(function(a, b)
            {
                var x=a[1].toLowerCase(),
                    y=b[1].toLowerCase();
                return x<y ? -1 : x>y ? 1 : 0;
            });
            return sortable; // array in format [ [ key1, val1 ], [ key2, val2 ], ... ]
        }
        

        【讨论】:

          猜你喜欢
          • 2013-10-31
          • 1970-01-01
          • 2015-11-07
          • 2011-09-26
          • 1970-01-01
          • 1970-01-01
          • 2013-05-13
          • 2016-11-18
          • 1970-01-01
          相关资源
          最近更新 更多