#javascript
#javascript
Вопрос:
У меня есть данные json, подобные этому:
{
"s:Envelope": {
"s:Body": {
"ExecuteSnapshotRequestsResponse": {
"ExecuteSnapshotRequestsResult": {
"a:SnapshotResponseItemBase": [
{
"a:AdditionalDetails": {},
"a:Error": {},
"a:Tag": {
"_text": "0~##~vod~##~PI,DY,MV"
},
"a:Instrument": {
"_text": "vod"
},
"a:InstrumentDisplay": {},
"a:Currency": {
"_text": "£ "
},
"a:DataTypeValues": {
"a:DataTypeResponseValueBase": [
{
"a:DataType": {
"_text": "PI"
},
"a:DataTypeDisplayName": {
"_text": "PRICE INDEX"
},
"a:Value": {
"_text": "1238.4"
}
},
{
"a:DataType": {
"_text": "DY"
},
"a:DataTypeDisplayName": {
"_text": "DIVIDEND YIELD"
},
"a:Value": {
"_text": "9.25"
}
},
{
"a:DataType": {
"_text": "MV"
},
"a:DataTypeDisplayName": {
"_text": "MARKET VALUE"
},
"a:Value": {
"_text": "38823.49"
}
}
]
},
"a:Date": {
"_text": "2019-04-17T00:00:00"
}
},
{
"a:AdditionalDetails": {},
"a:Error": {},
"a:Tag": {
"_text": "0~##~@AAPL~##~PI,DY,MV"
},
"a:Instrument": {
"_text": "@AAPL"
},
"a:InstrumentDisplay": {},
"a:Currency": {
"_text": "U$"
},
"a:DataTypeValues": {
"a:DataTypeResponseValueBase": [
{
"a:DataType": {
"_text": "PI"
},
"a:DataTypeDisplayName": {
"_text": "PRICE INDEX"
},
"a:Value": {
"_text": "39566.2"
}
},
{
"a:DataType": {
"_text": "DY"
},
"a:DataTypeDisplayName": {
"_text": "DIVIDEND YIELD"
},
"a:Value": {
"_text": "1.44"
}
},
{
"a:DataType": {
"_text": "MV"
},
"a:DataTypeDisplayName": {
"_text": "MARKET VALUE"
},
"a:Value": {
"_text": "957814.5"
}
}
]
},
"a:Date": {
"_text": "2019-04-17T00:00:00"
}
}
]
}
}
}
}
}
Я хотел бы получить вывод, подобный этому:
[['vod','1238.4','9.25','38823.49'],['@AAPL','39566.2','1.44','957814.5']]
Я пробовал это, но я получаю вывод только в одном массиве:
пусть arr = [];
totalRows.forEach(v => {
arr.push(v["a:Instrument"]["_text"]);
v["a:DataTypeValues"]["a:DataTypeResponseValueBase"].map((e, i) => {
arr.push(e["a:Value"]["_text"]);
});
});
но я хочу несколько массивов для каждого a:SnapshotResponseItemBase
и получить a:Instrument
и a:Value
Обновить:
Я исправил это следующим образом, но можно ли это оптимизировать?
let arr = [];
for (var i = 0; i < totalRowsCount; i ) {
arr.push(totalRows[i]["a:Instrument"]["_text"]);
for (var j = 0; j < totalRows[i]["a:DataTypeValues"]["a:DataTypeResponseValueBase"].length; j ) {
arr.push(totalRows[i]["a:DataTypeValues"]["a:DataTypeResponseValueBase"][j]["a:Value"]["_text"]);
}
}
Комментарии:
1. Кроме того, почему вы хотите, чтобы это был массив массивов, а не словарь массивов, где ключом является
vod
или@AAPL
, а значениями являются числа.2.
arr.push(...v["a:DataTypeValues"]["a:DataTypeResponseValueBase"].map( e => e["a:Value"]["_text"]))
3. @stackErr вот как существующее приложение понимает данные
Ответ №1:
const arr = totalRows
.map(el => [
el['a:Instrument']._text,
...el['a:DataTypeValues']['a:DataTypeResponseValueBase']
.map(e => e['a:Value']._text)
]);
Ответ №2:
Попробуйте это, приятель
arr = totalRows.map(element => {
let one = element["a:Instrument"]["_text"];
let two = element["a:DataTypeValues"]["a:DataTypeResponseValueBase"].map(subArrayElement => {
return subArrayElement["a:Value"]["_text"];
})
return [...one, ...two];
})
console.log(arr);