Как передать словарь C # в карту машинописного текста

Как правильно передать словарь C # в машинописную карту.

[HttpGet("reportsUsage")]
    public IActionResult GetReportsUsage()
    {
        //var reportsUsage = _statService.GetReportsUsage();

        IDictionary<int, int> test = new Dictionary<int, int>();

        test.Add(1, 20);
        test.Add(2, 30);
        test.Add(3, 40);
        test.Add(4, 50);
        test.Add(5, 70);
        test.Add(6, 60);
        test.Add(7, 90);
        test.Add(8, 30);

        return Ok(test);
        //return Ok(reportsUsage );
    }

В угловом:

getReportsUsage() {
return this.http.get<Map<number, number>>(`${environment.apiUrl}/stats/reportsUsage`, {
  headers: new HttpHeaders({
    'Content-Type': 'text/plain',
    'Accept': 'application/json'
  }),
  withCredentials: true
});
}

reportsUsage = new Map<number, number>();

this.statsService.getReportsUsage().subscribe(data => {
    this.reportsUsage = data;
    
    //1
    console.log(this.reportsUsage);
    //2
    console.log(this.reportsUsage.values());
    //3
    console.log(typeof(this.reportsUsage));
};

Полученные результаты:

1

{1: 20, 2: 30, 3: 40, 4: 50, 5: 70, 6: 60, 7: 90, 8: 30}

2

ERROR TypeError: this.reportsUsage.values is not a function

3

object

Итак, тип данных изменился из словаря в объект, я попытался преобразовать его с помощью приведенного ниже, но все еще не работал:

console.log(new Map(this.reportsUsage));

TypeError: object is not iterable (cannot read property Symbol(Symbol.iterator))

# angular asp.net-core asp.net-web-api
Источник
Codelisting
за 3 против
Лучший ответ

Я не знаю, что C # здесь очень актуален, за исключением того факта, что по сети передается объект JSON, подобный этому:

const data: Record<number, number> = 
  { 1: 20, 2: 30, 3: 40, 4: 50, 5: 70, 6: 60, 7: 90, 8: 30 };

Это еще не JavaScriptMap , но простой объект JSON. Итак, правильный тип для использования, вероятно,Record<number, number> где я использую Recordслужебный тип, чтобы сказать «объект с цифровыми клавишами и числовыми значениями».

Итак, когда вы звоните своемуhttp.get вы должны указатьRecord<number, number> вместо тогоMap<number, number> :

this.http.get<Record<number, number>>(...)

Если вы хотите преобразовать это вMap , вам нужно позвонить вMap конструктор с соответствующим итеративным аргументом (например, массивом) кортежей ключ-значение. А поскольку объекты JSON всегда имеютstring ключи а не актуальныеnumber s, вам нужно преобразовать в числа самостоятельно, если вы хотите, чтобы результирующая карта былаMap<number, number> вместо тогоMap<string, number> :

const map = new Map(Object.entries(data).map(([k, v]) => [+k, v]));
// const map: Map<number, number>

Это использует Object.entries() чтобы преобразовать объект JavaScript в массив таких кортежей записей, и мы сопоставляем эти записи так, чтобы ключи были числами.

Убедимся, что это работает:

console.log(map.get(3)?.toFixed(2)) // "40.00"

Выглядит неплохо. Ссылка на игровую площадку на код

за 0 против

1- если вы хотите создать карту из отчетов

const map = new Map(Object.entries(this.reportsUsage));
console.log(map.get("1")); // prints 20

2- если вам нужен массив только со значениями:

const arrayOfValues = Object.values(this.reportsUsage)
Codelisting
Популярные категории
На заметку программисту