Javascript анализирует ответный объект в массив объектов
Ниже приведен ответ от API NVP Paypal. Я не знаком с работой с ответом, который является единственным объектом ключей / значений, подобным этому. Обычно я ожидаю, что поиск будет возвращен в виде массива с объектами внутри.
Есть ли способ для меня, чтобы превратить это в массив объектов?
{
L_TIMESTAMP0: "2018-05-08T19:23:17Z",
L_TIMESTAMP1: "2018-05-08T18:50:01Z",
L_TIMESTAMP2: "2018-05-08T18:45:30Z",
L_TIMEZONE0: "GMT",
L_TIMEZONE1: "GMT",
L_TIMEZONE2: "GMT",
L_TYPE0: "Payment",
L_TYPE1: "Payment",
L_TYPE2: "Payment",
L_NAME0: "Person One",
L_NAME1: "Person Two",
L_NAME2: "Person Three",
L_TRANSACTIONID0: "*********",
L_TRANSACTIONID1: "*********",
L_TRANSACTIONID2: "*********",
L_STATUS0: "Completed",
L_STATUS1: "Completed",
L_STATUS2: "Completed",
L_AMT0: "10.00",
L_AMT1: "100.00",
L_AMT2: "1000.00",
L_CURRENCYCODE0: "USD",
L_CURRENCYCODE1: "USD",
L_CURRENCYCODE2: "USD",
L_FEEAMT0: "-0.29",
L_FEEAMT1: "-2.93",
L_FEEAMT2: "-29.30",
L_NETAMT0: "9.71",
L_NETAMT1: "97.70",
L_NETAMT2: "970.70",
TIMESTAMP: "2018-05-08T19:47:10Z", // not for array
CORRELATIONID: "*******", // not for array
ACK: "Success", // not for array
VERSION: "204", // not for array
BUILD: "39949200" // not for array
}
Я хотел бы разобрать это в массив объектов:
const recentOrders = [{
timestamp: L_TIMESTAMP0,
timezone: L_TIMEZONE0,
type: L_TYPE,
.....
},
{ timestamp: L_TIMESTAMP1, .... },
{ timestamp: L_TIMESTAMP2, .... },
// .... and so forth
]
2 ответа
Примерно так должно работать:
var data = {
L_TIMESTAMP0: "2018-05-08T19:23:17Z",
L_TIMESTAMP1: "2018-05-08T18:50:01Z",
L_TIMESTAMP2: "2018-05-08T18:45:30Z",
L_TIMEZONE0: "GMT",
L_TIMEZONE1: "GMT",
L_TIMEZONE2: "GMT",
L_TYPE0: "Payment",
L_TYPE1: "Payment",
L_TYPE2: "Payment",
L_NAME0: "Person One",
L_NAME1: "Person Two",
L_NAME2: "Person Three",
L_TRANSACTIONID0: "*********",
L_TRANSACTIONID1: "*********",
L_TRANSACTIONID2: "*********",
L_STATUS0: "Completed",
L_STATUS1: "Completed",
L_STATUS2: "Completed",
L_AMT0: "10.00",
L_AMT1: "100.00",
L_AMT2: "1000.00",
L_CURRENCYCODE0: "USD",
L_CURRENCYCODE1: "USD",
L_CURRENCYCODE2: "USD",
L_FEEAMT0: "-0.29",
L_FEEAMT1: "-2.93",
L_FEEAMT2: "-29.30",
L_NETAMT0: "9.71",
L_NETAMT1: "97.70",
L_NETAMT2: "970.70",
TIMESTAMP: "2018-05-08T19:47:10Z", // not for array
CORRELATIONID: "*******", // not for array
ACK: "Success", // not for array
VERSION: "204", // not for array
BUILD: "39949200" // not for array
};
const recentOrders = [];
var keys = Object.keys(data).filter(r => r.startsWith('L_'));
keys.forEach(k => {
var index = parseInt(k.replace(/\D/g,''));
var newKey = k.substring(2).replace(/[0-9]/g, '').toLowerCase();
if (recentOrders[index] === undefined) {
recentOrders[index] = {};
}
recentOrders[index][newKey] = data[k];
});
console.log(recentOrders);
Я не совсем уверен, какой результат вы хотите получить, но, по сути, вы хотите отобразить и преобразовать данные из очень плоской структуры, которая вам дана, в список связанных объектов.
Вы можете сделать это, используя некоторые основные нативные методы массивов для фильтрации карты и реорганизации ваших данных. Следующий код в основном делает следующее:
- Получить ключи от объекта
- Отфильтруйте ключи по номерам, которые вы хотите
- Сопоставьте ключи с небольшим информационным объектом о каждом
- Реорганизовать список ключей в список объектов с исходными индексированными данными в объектах с правильным индексом.
Это может быть сделано в одной строке с конечным результатом, являющимся переменной RecentOrders, установленной в массив из 3 объектов с именованными ключами в нижнем регистре (что я думаю, что вы после)
const recentOrders = Object.keys(data)
.filter(function (key) {
return key.startsWith('L_')
})
.map(function (key) {
const parts = key.match(/^L_([A-Z]+)(\d+)$/);
return {
key: parts[1].toLowerCase(),
value: data[key],
index: parseInt(parts[2])
};
})
.reduce(function (recentOrders, item) {
if (recentOrders[item.index] == null) {
recentOrders[item.index] = {}
}
recentOrders[item.index][item.key] = item.value;
return recentOrders ;
}, []);
console.log(recentOrders);