Я хочу преобразовать Java HashMap в массив javascript, где ключ находится внутри объекта javascript.
Я попытался преобразовать JSON в объект javascript с массивом внутри. Карта Java выглядит следующим образом: <string: "sequence", Object: Round>
Краткий обзор объектов, которые я хочу преобразовать из объекта Java (JSON) в массив javascript.
export class Order extends Base {
public createdAt: Date;
public status: OrderStatus;
public rounds: Round[];
}
export class Round extends Base {
public lockable: boolean;
public locked: boolean;
public sequence: number;
public createdAt: string;
public orderedItems?: Item[];
}
JSON, который я получаю с сервера:
[
{
"id": "87921b20-232d-4e13-8154-5ecdcdfeea83",
"createdAt": 1556284343924,
"status": "UNPAID",
"rounds": {
"1": {
"id": "ffd791b7-3575-4653-9e65-0d95ed027d37",
"createdAt": 1556284343930,
"lockable": false,
"locked": false,
"orderedItems": []
},
"2": {
"id": "310bbdff-2c41-4e22-96da-46282e158b49",
"createdAt": 1556284343936,
"lockable": true,
"locked": false,
"orderedItems": []
}
}
}
]
Сейчас я хочу сделать следующее. Я думал, что в javascript порядок массива не гарантируется, поэтому я хотел добавить идентификатор внутри объекта после его извлечения из API.
"2": <-- MOVE SEQUENCE inside the object like:
{
...
"sequence": "2"
}
Я не смог найти другое решение, подобное этому, в javascript, но, надеюсь, вы можете дать мне более правильное решение:
order.forEach(o => {
const rounds = [];
Object.keys(o.rounds).forEach(key => {
o.rounds[key].sequence = key;
rounds.push(o.rounds[key]);
});
o.rounds = rounds;
});



![Безумие обратных вызовов в javascript [JS]](https://i.imgur.com/WsjO6zJb.png)


Вы можете упростить его, используя Объект.значения() для перебора значений order.rounds с последующим сопоставлением массива, чтобы включить свойство sequence в каждый объект массива.
const order = [{
"id": "87921b20-232d-4e13-8154-5ecdcdfeea83",
"createdAt": 1556284343924,
"status": "UNPAID",
"rounds": {
"1": {
"id": "ffd791b7-3575-4653-9e65-0d95ed027d37",
"createdAt": 1556284343930,
"lockable": false,
"locked": false,
"orderedItems": []
},
"2": {
"id": "310bbdff-2c41-4e22-96da-46282e158b49",
"createdAt": 1556284343936,
"lockable": true,
"locked": false,
"orderedItems": []
}
}
}];
order.forEach(o => {
const res = Object.values(o.rounds).map((object, index) => {
object['sequence'] = index + 1;
return object;
});
console.info(res)
});JSON, который вы получаете, не содержит массива Round; он содержит карту, как вы заметили. Было бы намного чище посмотреть на то, что сериализуется в этот JSON, и исправить его так, чтобы JSON выглядел как
[
{
...
"rounds": [
{
"id": "ffd791b7-3575-4653-9e65-0d95ed027d37",
"createdAt": 1556284343930,
"lockable": false,
"locked": false,
"orderedItems": []
},
{
"id": "310bbdff-2c41-4e22-96da-46282e158b49",
"createdAt": 1556284343936,
"lockable": true,
"locked": false,
"orderedItems": []
}
]
}
]
Однако, если вам действительно нужно, вы можете сделать:
var out = []
for(var key in obj) {
out[key] = obj[key]
}
Вы сказали: «Я думал, что в javascript порядок массива не гарантируется». Массивы определенно упорядочены в Javascript. Возможно, вы думаете о чем-то, что не является массивом? Поэтому я не вижу особого смысла в добавлении свойства sequence к каждому члену массива.
Однако, если вы действительно хотите, это достаточно просто:
var out = [];
for(var key in obj) {
out[key] = m[key]
out[key].sequence = key
}
Все это зависит от того, что все ключи являются числами или могут быть приведены к числам.
«JSON, который я получил от сервера»: какой сервер? У вас есть контроль над этим?