在保留键的情况下,基于对象属性对映射进行排序
Sort map based on object property while keeping key
我创建了一个包含产品列表的地图,以及离它最近的销售该产品的商店,如下所示:
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
相关文章:
- 为什么我可以在Array属性对象中找到Javascript Array for Each方法
- 使用onclick调用属性对象函数
- 嵌套为..in 循环,列出多维对象的属性(对象)
- 动态属性对象 - JSON
- 在不使用隔离范围angularjs自定义指令的情况下获取属性对象
- 通过属性传递属性/对象.Javascript
- Javascript:属性/对象的类型
- 访问JSON中的属性(对象)
- 属性对象Javascript不是用Jquery Deferred设置的
- 无法读取属性'#<对象>'未定义的获取错误
- Twitter中多属性对象的子字符串匹配
- 无法设置'data'属性'对象'标记.(只IE8)
- 更新数据属性对象属性值
- 将属性对象的选定对象从原型推入数组
- 将单个属性对象字面量的数组转换为仅包含其值的数组的最佳方法
- 寻找一种更简单的方法来检查是否多个属性&对象中的方法是未定义的
- 主干模型:带有get方法的空属性,但在属性对象中
- 如何赋值给"text"someText"属性对象在动能js
- Angularjs的数据绑定与数据属性对象
- 如何将一个嵌套的javascript对象转换为只有一级属性对象