在保留键的情况下,基于对象属性对映射进行排序

Sort map based on object property while keeping key

本文关键字:属性 对象 映射 排序 保留 情况下 于对象      更新时间:2023-09-26

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

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

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

我使用地图,因为我也需要进入并能够使用键找到到特定产品的距离。

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

"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)));

输出:

Map {
  'product_key' => { shop: 'shop_key', distance: 1.2 },
  'product2_key' => { shop: 'shop2_key', distance: 0.1 } }
[ { shop: 'shop2_key', distance: 0.1 },
  { shop: 'shop_key', distance: 1.2 } ]

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"));

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

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