Как правильно преобразовать Java Hashmap в массив javascript

Я хочу преобразовать 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;
});

«JSON, который я получил от сервера»: какой сервер? У вас есть контроль над этим?

slim 26.04.2019 15:37
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
0
1
2 925
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Вы можете упростить его, используя Объект.значения() для перебора значений 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        
}

Все это зависит от того, что все ключи являются числами или могут быть приведены к числам.

Другие вопросы по теме