2016-11-03 2 views
2

я создал карту, которая содержит список продуктов, и магазин ближайшего тем, что продает этот продукт, например, так:Сортировка карты на основе объекта недвижимости, сохраняя при этом ключе

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

Теперь то, что я хотел сделать, это отсортировать всю карту на расстоянии, чтобы я мог перечислить продукты по близости к моему местоположению.

Я использую карту, потому что мне также нужно войти и уметь находить расстояние до одного конкретного продукта с помощью ключа.

+1

Карта, как объект, он имеет ключи и значения, и они на самом деле не сортируется – adeneo

ответ

1

Один из способов состоит из массива ключей, отсортированных по расстоянию:

"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 } ] 
+0

Я надеялся избежать лишнего массива, на всякий случай, когда набор данных станет большим в какой-то момент, но похоже, что это неизбежно, и это хорошее и чистое решение, спасибо. – Mads

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 
+0

Этот ответ изменил рисунок слишком много, чтобы быть моим любимым, но спасибо тем не менее. – Mads

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

+0

Возможность получить элементы на карте с ключом перед сортировкой весьма важна для большего потока, который я имел в виду, поэтому этот подход не работает специально для этого, но спасибо за очень тщательный ответ! – Mads

Смежные вопросы