Как правильно передать словарь 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))
Я не знаю, что 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"
Выглядит неплохо. Ссылка на игровую площадку на код
1- если вы хотите создать карту из отчетов
const map = new Map(Object.entries(this.reportsUsage));
console.log(map.get("1")); // prints 20
2- если вам нужен массив только со значениями:
const arrayOfValues = Object.values(this.reportsUsage)