在保持键的同时基于对象属性对映射进行排序

时间:2016-11-03 15:22:28

标签: javascript node.js

我创建了一个包含产品列表的地图,最近的商店正在销售该产品,如下所示:

var products = new Map()
products.set('product_key', {
  shop: 'shop_key',
  distance: 1.2
})

现在我想做的是在距离属性上对整个地图进行排序,这样我就可以靠近我的位置列出产品。

我使用地图是因为我还需要进入并能够使用密钥找到与特定产品的距离。

3 个答案:

答案 0 :(得分:1)

Map广告订单中循环显示其条目;你不能对地图进行排序,你只能按照你想要的排序顺序创建一个。

对于您正在做的事情,我可能会使用一系列条目,然后将字符串映射到数组中的条目:



const productList = [
    {distance: 1.8, product_key: "one", shop: "shop_key1"},
    {distance: 1.2, product_key: "two", shop: "shop_key2"},
    {distance: 1.4, product_key: "three", shop: "shop_key3"}
];
productList.sort((a, b) => a.distance - b.distance);
const map = new Map();
productList.forEach(entry => {
    map.set(entry.product_key, entry);
});

console.log("List:");
productList.forEach(entry => {
    console.log(JSON.stringify(entry));
});
console.log("Product 'two':", map.get("two"));




允许您根据需要重新排序。

但同样,Map按插入顺序进行迭代,因此可以只用Map作为端点,通过按顺序插入条目来执行:



const productList = [
    {distance: 1.8, product_key: "one", shop: "shop_key1"},
    {distance: 1.2, product_key: "two", shop: "shop_key2"},
    {distance: 1.4, product_key: "three", shop: "shop_key3"}
];
productList.sort((a, b) => a.distance - b.distance);
const map = new Map();
productList.forEach(entry => {
    map.set(entry.product_key, entry);
});
productList = null; // don't need it anymore

console.log("List:");
for (let entry of map) {
    console.log(JSON.stringify(entry));
}
console.log("Product 'two':", map.get("two"));




答案 1 :(得分:1)

一种方法是按距离排序按键数组:

<input type="datetime-local" name="time" value="<%= Time.now.strftime('%Y-%m-%dT%H:%M') %>" />

输出:

"use strict";

var products = new Map()
products.set('product_key', {
    shop: 'shop_key',
    distance: 1.2
})
products.set('product2_key', {
    shop: 'shop2_key',
    distance: 0.1
})
console.log(products);

var keysByDistance = Array.from(products.keys()).sort((a, b) => products.get(a).distance - products.get(b).distance);
console.log(keysByDistance.map(key => products.get(key)));

答案 2 :(得分:0)

将一些片段移动到数组,产品键和距离,然后对该数组进行排序。排序后进行查找。

var products = {
   p1:300, p2:60, p3:200, p4:1000,
   p5:400, p6:600
}
var sortable = [];
for (var x in products)
  sortable.push([x, product[x]])
sortable.sort(
   function(a, b) {
      return a[1] - b[1]
   }
)

//Do lookup on the map based on first elements in sorted array