JavaScript Convert Object {} to Array [] – как преобразовать объект в массив

Во многих случаях бывает довольно удобно оперировать именно объектами в JavaScript, нежели массивами. Но что делать, если в каком-то месте кода надо преобразовать объект (Object) в массив (Array)?


Допустим, у вас есть объект вида:

var user = {
    last_name: "Jack",
    first_name: "Ma",
    address: "some existing address"
};

Не имеет значения, как и где вы его получили, просто предположим, что он уже у вас есть.

Если этот объект данных вам надо отправить на сервер, то скорее всего вы сделаете это так (в самом простом случае; не будем сейчас рассматривать какую-то сложную логику, суть от этого не изменился, но сам пример будет более громоздким):

$.post(
    "/target", {
        user: user
    },
    function (response) {
        // do something
    },
    "json"
);

Но тут приходит задача: вместе с данными пользователя дополнительно отправлять на сервер ещё и фото этого самого пользователя.

Самый простой вариант в этой ситуации – это просто объявить переменную с new FormData(), засунуть туда все данные и отправить на сервер чуть изменённый запрос:

var formData = new FormData();
formData.append("file", $('#upload-file')[0].files[0]);

formData.append("user", user);

$.ajax({
    type: 'POST',
    url: "/target",
    contentType: false,
    dataType : 'json',
    processData: false,
    data: formData,
    success: function (response) {
        // do something
    }
});

Но сервер вдруг отказывается принимать данные, потому что вместо нужных нам данных в поле user отправляется [Object] 🤔

Есть простой выход: преобразовать объект object user в массив array user:

var formData = new FormData();
formData.append("file", $('#upload-file')[0].files[0]);

var key;
for (key in user) {
    if (user.hasOwnProperty(key) && user[key]) {
        formData.append("user[" + key + "]", user[key]);
    }
}

// остальная часть запроса остаётся без изменений

Код выше написан для "одномерного" объекта без вложенных объектов, но оно тут только для того, чтобы передать суть, на мой взгляд, наиболее простого решения.

Отдельно отмечу, что это не единственный вариант решения данной задачи, но это уже совсем другая история... 😅 Своё самое простое решение мы в итоге получили.