arrayer - Hur kan jag skapa en Map med icke-unika nycklar i JavaScript/TypeScript?


För att kunna gränssnitt med befintlig kod hoppas jag kunna implementera en Map med icke-unika nycklar i JavaScript/TypeScript (för en webbapp i Angular).

Jag vet att Mappar i JavaScript/TypeScript kräver unika nycklar. Hur kan jag implementera en "icke-unik" Mapp?

Att skapa en array av nyckel-värde-objekt fungerar inte eftersom strukturen inte deserialiseras från JSON i rätt form för den befintliga konsumentkoden.

Till exempel hoppas jag kunna skapa något som liknar följande struktur:

vehicleOptions : NonUniqueMap<key: string, value: {color: string, isTowingCapable: boolean}>
{
  "Truck", { "Red", true },
  "Compact Sedan", { "Black", false },
  "Compact Sedan", { "Blue", false }
}

Svar #1

Du kan inte.

Du kan skapa en unik karta. När du har två samma nycklar kan du lagra dem som:

const map = {
    "Truck": [{ "Red": true }],
    "Compact Sedan": [{ "Black": false }, { "Blue": false }]
}

Sedan, när du får värdet av Compact Sedan, får du en array.

Så att du kan få det första/andra värdet:

map["Compact Sedan"][0]; // { "Black": false }
map["Compact Sedan"][1]; // { "Blue": false }

Svar #2

Du kan också använda denna funktion för att skapa uniqMap med List-värden:

function getBucketMap<T>(array: T[], uniqueProperty: string = 'id'): Map<any, T[]> {
    return array
    .filter(value => value)
    .reduce((bucketMap: Map<any, T[]>, item: T) => {
        const list = [item];

        if (bucketMap.has(item[uniqueProperty])) {
            list.push(...bucketMap.get(item[uniqueProperty]));
        }
        bucketMap.set(item[uniqueProperty], list);

        return bucketMap;

     }, new Map<any, T[]>());
}

så du kan skicka en array av bilar och skicka en unik egenskap så här:

const cars = [
  {
    type: 'Truck',
    info: {
        'black': true
    } 
  },
  {
    type: 'Truck',
    info: {
        'black': true
    } 
  },
  {
    type: 'Compact Sedan',
    info: {
        'blue': false
    } 
  },
];

const carsMap = getBucketMap(cars, 'type');