Я использую таблицу набора iView UI в своем приложении Vue.js, которое использует Elasticsearch API с axios.Моя проблема в том, что я просто не могу получить доступ к вложенному объекту ответа поиска, который является объектом списка массива.Я получаю доступ только к полям 1-го уровня, но не к вложенным.Я не знаю, как установить ключ строки таблицы в таблице iView.
Вот так выглядят мои методы вызовов axios и mapper:
listObjects(pageNumber){
const self = this
self.$Loading.start()
self.axios.get("/api/elasticsearch/")
.then(response => {
self.ajaxTableData = self.mapObjectToArray(response.data);
self.dataCount = self.ajaxTableData.length;
if(self.ajaxTableData.length < self.pageSize){
self.tableData = self.ajaxTableData;
} else {
self.tableData = self.ajaxTableData.slice(0,self.pageSize);
}
self.$Loading.finish()
})
.catch(e => {
self.tableData = []
self.$Loading.error()
self.errors.push(e)
})
},
mapObjectToArray(data){
var mappedData = Object.keys(data).map(key => {
return data[key];
})
return mappedData
},
Столбцы таблицы iView выглядят следующим образомthis:
tableColumns: [
{
title: 'Study Date',
key: 'patientStudy.studyDate',
width: 140,
sortable: true,
sortType: 'desc'
},
{
title: 'Modality',
key: "generalSeries.modality",
width: 140,
sortable: true
},
...
]
(необработанные) документы Elasticsearch выглядят так:
[
{ "score":1, "id":"3a710fa2c1b3f6125fc168c9308531b59e21d6b3",
"type":"dicom", "nestedIdentity":null, "version":-1, "fields":{
"highlightFields":{
},
"sortValues":[
],
"matchedQueries":[
],
"explanation":null,
"shard":null,
"index":"dicomdata",
"clusterAlias":null,
"sourceAsMap":{
"generalSeries":[
{
"seriesInstanceUid":"999.999.2.19960619.163000.1",
"modality":"MR",
"studyInstanceUid":"999.999.2.19960619.163000",
"seriesNumber":"1"
}
],
"patientStudy":[
{
"studyDate":"19990608"
}
]
}
}]
А вот так выглядит потребляемый объект:
Как видите, поля, к которым мне нужно получить доступ, находятся внутри объекта "sourceAsMap", а затем вложены в массивы.Как я могу предоставить ключ ячейки таблицы iView для доступа к ним?
ОБНОВЛЕНИЕ: Теперь я "переназначил" свой объект Elasticsearch перед его отображением в таблице Vue.js, и теперь он работает.Тем не менее, я не думаю, что то, как я это сделал, очень элегантно или чисто ... возможно, вы поможете мне сделать это лучше.Это мой метод переназначения объекта:
getData(data){
let jsonMapped = []
for(let i = 0; i < data.length; i++){
let id = {}
id['id'] = data[i].id
let generalData = data[i]['sourceAsMap']['generalData'][0]
let generalSeries = data[i]['sourceAsMap']['generalSeries'][0]
let generalImage = data[i]['sourceAsMap']['generalImage'][0]
let generalEquipment = data[i]['sourceAsMap']['generalEquipment'][0]
let patient = data[i]['sourceAsMap']['patient'][0]
let patientStudy = data[i]['sourceAsMap']['patientStudy'][0]
let contrastBolus = data[i]['sourceAsMap']['contrastBolus'][0]
let specimen = data[i]['sourceAsMap']['specimen'][0]
jsonMapped[i] = Object.assign({}, id, generalData, generalSeries, generalImage, generalEquipment, patient,
patientStudy, contrastBolus, specimen)
}
return jsonMapped
},
Результат таков:
Даже если он теперь работает,но как я могу оптимизировать этот код?