Javascript 使用oracle jet+knockout JS+elasticsearch根据用户列选择填充动态列

Javascript 使用oracle jet+knockout JS+elasticsearch根据用户列选择填充动态列,javascript,knockout.js,oracle-jet,Javascript,Knockout.js,Oracle Jet,在我的网站开发中,我提供了组合框,用户可以在其中选择要显示的列,并根据用户的请求获取和显示数据。因此,我提供了组合框选择,如下所示 <div id="filterColumns" style="width: 1px; min-width: 100%;"> <oj-label for="multiSelect">Select Columns</oj-label> <div id="columnsList"> <oj-select

在我的网站开发中,我提供了组合框,用户可以在其中选择要显示的列,并根据用户的请求获取和显示数据。因此,我提供了组合框选择,如下所示

<div id="filterColumns" style="width: 1px; min-width: 100%;">
  <oj-label for="multiSelect">Select Columns</oj-label>
  <div id="columnsList">
    <oj-select-many help.instruction="Select the columns to populate the data" id="multiSelect" value={{selectedColumns}} style="max-width:50em">
      <oj-option value="Name">Name</oj-option>
      <oj-option value="Age">Age</oj-option>
      <oj-option value="Gender">Gender</oj-option>
      <oj-option value="Mainden Name">Mainden Name</oj-option>
      <oj-option value="Mothers Name">Mothers Name</oj-option>
      <oj-option value="Designation">Designation</oj-option>
      <oj-option value="Experience">Experience</oj-option>
      <oj-option value="Company">Company</oj-option>
      <oj-option value="Location">Location</oj-option>
    </oj-select-many>
  </div>
  <oj-button id='filterColumnsGo' on-oj-action='[[generateData]]'>Generate Data</oj-button>
</div>
并使用基于选择的数据调用Elasticsearch API

下面是一个数据的响应

{
  "_index": "person_data",
  "_type": "_doc",
  "_id": "moahn",
  "_score": 1,
  "_source": {
    "person_details": {
      "age": 23,
      "gender": "male",
      "mothers_name": "Jabito",
      "mainden_name": "Rosoku",
      "designation_info": {
        "designation_name": "Architect",
        "company": {
            "company_location": "Delhi",
            "experience": 4,
        }
      }
    }
  }
}
我正在寻找一种方法,以用户在组合框中选择列名的相同顺序解析数据。我尝试如下循环,对于每个循环,我尝试循环获取的数据,但没有按预期工作

self.selectedColumns().forEach(function(col){
  tempCols.push({headerText: col, field: col});
  ...
  ...
});

由于Elasticsearch不提供我可以简单获取的项目名称详细信息,并且ES返回的数据是嵌套的JSON格式的结果,因此它不会与组合框中为用户选择显示的名称相同。任何帮助都将不胜感激

实现这一点的最简单方法是使用类似于模式的映射文件,在该文件中指定列如何与字段一一映射。所以你可以这样做:

ColumnDataMapping: {
   "age": { field: "age", label: "Age" }
   "mothersName": { field: "mothers_name", label: "Mothers Name" },
   "designation": { field: "designation_info.designation_name", label: "Designation" }
   "location": { field: "designation_info.company.company_location", label: "Location" }
   ...
}
然后,在视图模型中,使用该映射可以获得列及其映射到的字段。请注意,在组合框中,您的值与标签不同。值将是ColumnDataMapping中的键,标签将是标签字段

通过这种方式,您可以灵活地使用代码,因为您只关心模式的正确配置。因此,您可以从代码中分离字段映射等知识

这也允许您现在存储该模式并使其可自定义。您还可以添加任何要扩展的字段。。。如为字段等启用

ColumnDataMapping: {
   "age": { field: "age", label: "Age" }
   "mothersName": { field: "mothers_name", label: "Mothers Name" },
   "designation": { field: "designation_info.designation_name", label: "Designation" }
   "location": { field: "designation_info.company.company_location", label: "Location" }
   ...
}