2016-11-03 7 views
2

Ich habe eine Karte erstellt, die eine Liste von Produkten enthält, und das Geschäft am nächsten durch das heißt, das Produkt zu verkaufen, etwa so:Sort Karte auf Objekteigenschaft basiert, während Schlüssel zu halten

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

was Nun möchte Ich mag Zu tun ist, die gesamte Karte auf der Entfernungseigenschaft zu sortieren, damit ich die Produkte durch Nähe zu meinem Standort auflisten kann.

Ich benutze eine Karte, weil ich auch hineingehen muss und die Entfernung zu einem bestimmten Produkt mit dem Schlüssel finden kann.

+1

Eine Karte wie ein Objekt ist, es Schlüssel und Werte hat, und sie sind nicht wirklich sortierbar – adeneo

Antwort

1

Ein Weg, ist eine Reihe von Schlüsseln nach Entfernung sortiert:

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

Ausgänge:

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

Ich hatte gehofft, ein zusätzliches Array zu vermeiden, nur für den Fall, dass der Datensatz irgendwann groß wird, aber es scheint, als wäre es unvermeidlich und das ist eine schöne und saubere Lösung, danke. – Mads

0

Verschieben Sie einige Teile in ein Array, den Produktschlüssel und die Entfernung, und sortieren Sie dann das Array. Führen Sie die Suche nach dem Sortieren durch.

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

Diese Antwort mein Favorit, das Muster zu sehr verändert sein, aber ich danken Ihnen nicht weniger. – Mads

1

Map Schleifen durch die Einträge in Einsetzfolge; Sie können eine Karte nicht sortieren, Sie können nur eine in der sortierten Reihenfolge erstellen, die Sie möchten.

Für das, was du tust, ich wahrscheinlich eine Reihe von Einträgen, und dann eine Karte Mapping-Strings zu den Einträgen verwenden würde, die in dem Array sind:

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

That können Sie nach Bedarf neu sortieren.

Aber auch hier Map Iterierten in Auftrag, so dass Sie können tun es mit nur einem Map als Endpunkt, indem Sie die Einträge, um das Einfügen:

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

Die Elemente in der Karte mit dem Schlüssel vor dem Sortieren zu bekommen, ist ziemlich wichtig für den größeren Fluss, den ich im Sinn hatte, daher funktioniert dieser Ansatz nicht speziell, aber danke für eine sehr gründliche Antwort! – Mads

Verwandte Themen