【问题标题】:Vue.js with iView Table - accessing Elasticsearch search response object带有 iView 表的 Vue.js - 访问 Elasticsearch 搜索响应对象
【发布时间】:2019-02-15 15:47:16
【问题描述】:

我在我的 Vue.js 应用程序中使用 iView UI 工具包表,该应用程序使用带有 axios 的 Elasticsearch API。我的问题是我似乎无法访问嵌套的搜索响应对象,它是一个数组列表对象。我只能访问第一级字段,但不能访问嵌套字段。我不知道如何在 iView 表格中设置表格行键。

这就是我的 axios 调用和映射器方法的样子:

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 表格列如下所示:

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
},

结果是这样的:

虽然现在可以运行了,但是我该如何优化这段代码呢?

【问题讨论】:

  • 每个键是否都包含一个包含一个或多个对象的数组?如果有的话,您可以转换您的响应并避免使用单个元素数组。
  • 每个数组只包含一个元素(对象)。我将如何进行这样的转换?

标签: vue.js iview


【解决方案1】:

一些功能可以帮助您解决您的情况

let data = [{
    key1: ['k1'],
    key2: ['k2'],
    key3: [{
        subKey1: 'sk1',
        subKey2: ['sk2'],
        subObject: [{ name: 'John', surname: 'Doe' }],
        items: [1, 2, 3, 5, 7]
    }]
}];
function mapIt(data) {
    if (isSingletonArray(data)) {
       data = data[0];
    }
    for(const key in data) {
        if (isSingletonArray(data[key])) {
            data[key] = mapIt(data[key][0]);
        } else {
            data[key] = data[key];
        }
    }
    return data;
}
function isSingletonArray(obj) {
    return typeof obj === 'object' && Array.isArray(obj) && obj.length === 1;
}
console.log(mapIt(data));

输出:

{ 
    key1: 'k1',
    key2: 'k2',
    key3: { 
        subKey1: 'sk1',
        subKey2: 'sk2',
        subObject: { name: 'John', surname: 'Doe' },
        items: [ 1, 2, 3, 5, 7 ] 
    } 
}

您可以在浏览器中查看。 mapIt 将单例数组解包为对象或原语。 但我建议您注意用于 javascript 的特殊弹性客户端库。它可以使您免于编写额外的代码。

【讨论】:

  • Lev,感谢您的帮助,但由于某种原因,这不起作用。我认为这与不支持表格单元键的嵌套对象的 UI 工具包有关。我不知道如何让它发挥作用......还有其他想法/建议吗?
  • 那么最好创建平面对象,其中包含要放入表中的字段。表列配置中的tableData = { studyDate: data.patientStudy.studyDate, modality: data.generalSeries.modality }keys 看起来像{ key: 'studyDate' }
猜你喜欢
  • 2016-10-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-09-12
  • 1970-01-01
相关资源
最近更新 更多