Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/465.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在JavaScript/TypeScript中创建具有非唯一键的映射?_Javascript_Arrays_Angular_Typescript_Dictionary - Fatal编程技术网

如何在JavaScript/TypeScript中创建具有非唯一键的映射?

如何在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

为了与现有代码交互,我希望在JavaScript/TypeScript中实现一个带有非唯一键的映射(对于Angular中的web应用程序)

我知道JavaScript/TypeScript中的映射强制使用唯一键。如何实现“非唯一”映射

创建键值对象数组不起作用,因为该结构没有按照现有使用者代码的正确形状从JSON反序列化

例如,我希望创建如下结构:

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