Как я могу создать карту с неуникальными ключами в JavaScript / TypeScript? - PullRequest
0 голосов
/ 08 ноября 2018

Для взаимодействия с существующим кодом я надеюсь реализовать карту с неуникальными ключами в JavaScript / TypeScript (для веб-приложения на Angular).

Я знаю, что Карты в JavaScript / TypeScript используют уникальные ключи. Как я могу реализовать «неуникальную» карту?

Создание массива объектов Key-Value не работает, так как структура не десериализуется из JSON в правильной форме для существующего кода потребителя.

Например, я надеюсь создать что-то вроде следующей структуры:

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

Ответы [ 2 ]

0 голосов
/ 26 ноября 2018

Вы также можете использовать эту функцию для создания 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[]>());
}

, чтобы вы могли передать массив машин и передать и свойство uniq, например:

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

const carsMap = getBucketMap(cars, 'type');
0 голосов
/ 08 ноября 2018

Вы не можете.

Вы можете создать уникальную карту. Если у вас есть два одинаковых ключа, вы можете сохранить их как:

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 }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...