如何在JavaScript/TypeScript中创建具有非唯一键的映射?
为了与现有代码交互,我希望在JavaScript/TypeScript中实现一个带有非唯一键的映射(对于Angular中的web应用程序) 我知道JavaScript/TypeScript中的映射强制使用唯一键。如何实现“非唯一”映射 创建键值对象数组不起作用,因为该结构没有按照现有使用者代码的正确形状从JSON反序列化 例如,我希望创建如下结构:如何在JavaScript/TypeScript中创建具有非唯一键的映射?,javascript,arrays,angular,typescript,dictionary,Javascript,Arrays,Angular,Typescript,Dictionary,为了与现有代码交互,我希望在JavaScript/TypeScript中实现一个带有非唯一键的映射(对于Angular中的web应用程序) 我知道JavaScript/TypeScript中的映射强制使用唯一键。如何实现“非唯一”映射 创建键值对象数组不起作用,因为该结构没有按照现有使用者代码的正确形状从JSON反序列化 例如,我希望创建如下结构: vehicleOptions : NonUniqueMap<key: string, value: {color: string, isTow
vehicleOptions : NonUniqueMap<key: string, value: {color: string, isTowingCapable: boolean}>
{
"Truck", { "Red", true },
"Compact Sedan", { "Black", false },
"Compact Sedan", { "Blue", false }
}
vehicleOptions:ununiquemap
{
“卡车”{“红色”,对},
“紧凑型轿车”{“黑色”,假},
“紧凑型轿车”{“蓝色”,假}
}
你不能
您可以创建一个唯一的地图。
当您有两个相同的密钥时,可以将其存储为:
const map = {
"Truck": [{ "Red": true }],
"Compact Sedan": [{ "Black": false }, { "Blue": false }]
}
然后,当您获得Compact Sedan的值时,您将得到一个数组
因此,您可以获得第一个/第二个值:
map["Compact Sedan"][0]; // { "Black": false }
map["Compact Sedan"][1]; // { "Blue": false }
您还可以使用此函数创建具有列表值的uniqMap:
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[]>());
}
在这里,您可以滥用JS的passbyreference特性。对象是通过引用传递的,因此具有相同属性的两个不同对象仍然是唯一的。 考虑下面的例子:
function function_key(a,b){
this.a = a;
this.b = b;
}
function function_val(c,d,e){
this.c = c;
this.d = d;
this.e = e;
}
var myMapName = new Map();
myMapName.set(new function_key('a','b'),new function_val('c','d','e'));
myMapName.set(new function_key('a','b'),new function_val('c','d','e'));
myMapName.set(new function_key('a','b'),new function_val('c','d','e'));
myMapName.set(new function_key('a','b'),new function_val('c','d','e'));
myMapName.set(new function_key('a','b'),new function_val('c','d','e'));
console.log(myMapName);
改用包含对象的数组,例如
{label:'Truck',obj:{…}
。请注意,当前的{“Red”,true}
语法无效,键值对需要用冒号分隔,而不是逗号。为什么不使用数组呢?不清楚如何使用此数据结构。例如,当您在您的物品上使用钥匙Compact Sedan
时,为什么您希望返回?
function function_key(a,b){
this.a = a;
this.b = b;
}
function function_val(c,d,e){
this.c = c;
this.d = d;
this.e = e;
}
var myMapName = new Map();
myMapName.set(new function_key('a','b'),new function_val('c','d','e'));
myMapName.set(new function_key('a','b'),new function_val('c','d','e'));
myMapName.set(new function_key('a','b'),new function_val('c','d','e'));
myMapName.set(new function_key('a','b'),new function_val('c','d','e'));
myMapName.set(new function_key('a','b'),new function_val('c','d','e'));
console.log(myMapName);