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