如何在javascript中按值排序地图?

时间:2016-06-23 04:39:59

标签: javascript sorting dictionary

var map = new Map();
map.set("orange",10);
map.set("apple",5);
map.set("banana",20);
map.set("cherry",13);

如何按值对此地图进行排序?

9 个答案:

答案 0 :(得分:11)

const myMap = new Map();
myMap.set("a",3);
myMap.set("c",4);
myMap.set("b",1);
myMap.set("d",2);

// sort by value
const mapSort1 = new Map([...myMap.entries()].sort((a, b) => b[1] - a[1]));
console.log(mapSort1);
// Map(4) {"c" => 4, "a" => 3, "d" => 2, "b" => 1}

const mapSort2 = new Map([...myMap.entries()].sort((a, b) => a[1] - b[1]));
console.log(mapSort2);
// Map(4) {"b" => 1, "d" => 2, "a" => 3, "c" => 4}

// sort by key
const mapSort3 = new Map([...myMap.entries()].sort());
console.log(mapSort3);
// Map(4) {"a" => 3, "b" => 1, "c" => 4, "d" => 2}

const mapSort4 = new Map([...myMap.entries()].reverse());
console.log(mapSort4);
// Map(4) {"d" => 2, "b" => 1, "c" => 4, "a" => 3}

答案 1 :(得分:6)

Yo可以采用不同的方法并更改Symbol.iterator Map.prototype[@@iterator]()的自定义排序结果。



<asp:Content ID="Content" runat="server">
<asp:FormView ID="DataInsert" runat="server">
<div class="row-fluid">
 <div class="span6">
  <div class="control-group">
    <label class="control-label">SerialNumber:</label>
       <div class="controls">
          <asp:TextBox ID="txtSerialNum" runat="server" Enabled="false" Text="<%#BindItem.SERIAL_NUM">"</asp:TextBox>
      </div>
       </div>
      <div class="control-group">
    <label class="control-label">StockNumber:</label>
       <div class="controls">
          <asp:TextBox ID="txtStockNum" runat="server" Enabled="false" Text="<%#BindItem.STOCK_NUM">"</asp:TextBox>
      </div>
       </div>
      </div>
       </div>
      </asp:Formview>
       <div id="responsive" class="modal hide fade">
        <div class="modal-body">
          <div class="row-fluid">
            <div class="span12">
               <iframe id="PhoneFrame" src="<%= ResolveClientUrl(~pages/Phone.aspx)" %>" </iframe>
          </div>
       </div>
      </div>
       </div>
        </asp:Content>
&#13;
<asp:Gridview ID="phoneGrid" runat="server"
 SelectMethod= .....
  OnPreRender=......
   OnRowDataBound=..... etc.
   <Columns>
   <asp:BoundField HeaderText="Phone Serial Number:" DataField="P_SERIAL_NUM" />
     <asp:BoundField HeaderText="Phone Stock Number:" DataField="P_STOCK_NUM" />
      <ItemTemplateField>
       <ItemTemplate>
         <asp:Button ID="btnChoose" Text="Choose" OnClientClick="btnChooseClick()" />
           </ItemTemplateField>
       </ItemTemplate>
      </Columns>
      </asp:GridView>
&#13;
&#13;
&#13;

答案 2 :(得分:3)

您可以缩短该功能,并使用箭头功能(lambda)在ES6-中使用此功能

 let m2= new Map([...m.entries()].sort((a,b) => b[1] - a[1]))

答案 3 :(得分:2)

这是一个键值映射。维持插入密钥的顺序会破坏O(1)插入时间的好处。

为什么要对它进行排序?如果需要,最好维护一组键值对并对它们进行排序以便以后使用。对于你的情况,

arr = [["orange", 10],["appple", 5], ["banana", 20], ["cherry", 13]];

使用自定义排序功能

arr.sort = function(a,b) {
    return a[1]>b[1]? 1:a[1]<b[1]?-1:0;
}

应用排序,

keysArr.sort()

遍历已排序的keysArr并使用作为键来检索值的元素。

答案 4 :(得分:2)

在ES6中你可以这样做:(假设你的Map对象是m)。

[...m].map(e =>{ return e[1];}).slice().sort(function(a, b) {
  return a - b; 
});

spread运算符将Map对象转换为数组,然后取出每个子数组的第二个元素来构建一个新数组,然后对其进行排序。如果您想按降序排序,只需将a - b替换为b - a

答案 5 :(得分:1)

要对地图对象进行排序,请使用以下代码。

const map = new Map();
map.set("key","value");
map.set("key","value");//Here Key and Value may differ according to your map values.

const object = Object.keys(map.sort().reduce((a,b) => (a[k] = map[a], b), {});

console.log(object);

//This will work to sort a map by key.

答案 6 :(得分:0)

您可以使用列表地图而不是地图。 试试这个:

var yourListMaps = [];
var a = {quantity: 10, otherAttr: 'tmp1'};
var b = {quantity: 20, otherAttr: 'tmp2'};
var c = {quantity: 30, otherAttr: 'tmp3'};
yourListMaps.push(a);
yourListMaps.push(b);
yourListMaps.push(c);

如果您想按数量排序,您可以:

Sort c > b > a:
yourListMaps.sort(function(a,b){
    return b.quantity - a.quantity;
});

Sort a > b > c;
yourListMaps.sort(function(a,b){
    return a.quantity - b.quantity;
});

答案 7 :(得分:0)

这里有几个有效的答案,但我认为“有序地图”方面不必要地使事情复杂化和混淆。

假设获取一个按值排序的映射中的 列表就足够了,而不是一个按值排序的映射,那么这样的事情是有效的:

var map = {
  orange: 10,
  apple: 5,
  banana: 20,
  cherry: 13
}

var sorted_keys = Object.keys(map).sort(function(a,b) { return map[a] - map[b]; });

产生:

["apple", "orange", "cherry", "banana"]

如果您真的想遍历映射条目(现在您需要遍历已排序的键数组并获取值),这有点不太优雅,但是:

  1. 这个逻辑对于我简单的头脑来说更容易遵循和记住。

  2. “按值排序此映射”有一个非常常见的用例,其中您实际上想要排序的键列表:使用映射来保持计数。 (例如,使用映射遍历文件中的单词以尝试每个单词出现的频率,然后对该映射进行排序以按频率获得单词列表。)

对于地图中的值不一定是数字的一般情况,将比较器函数(传递给 Object.keys(map).sort 的函数)替换为:

function(a, b) {
  return (a < b) ? -1 : ( (a > b) ? 1 : 0 );
}

(本质上是:

function(a, b) {
  if (a < b) {
    return -1;
  } else if (a > b) {
    return 1;
  } else {
    return 0;
  }
}

但使用三元 (? :) 运算符。)

但请记住,JavaScript 的 <> 运算符的行为对于混合类型有时有点违反直觉,因此根据地图中的值,您可能希望包含显式类型 -在比较器中转换逻辑。

答案 8 :(得分:-1)

只需使用

即可对对象进行排序
const sortedObject = mapObject.sort((a,b)=>return b.value - a.value)