遍历包含2个以上数组的数组 - 遍历对象

时间:2016-11-07 15:21:15

标签: javascript elasticsearch pagination

我使用Elasticsearch(v1.5)JS(AngularJS)客户端msearch()API调用使用2种类型的查询生成1个搜索请求 - multi_match查询和mlt查询。除了对multi_match查询的结果进行分页外,一切都有效。

ES返回一个响应[array],其中包含两个查询在其自己的命中[array]中的结果。所以基本上你有

responses: [[hits],[hits]]

第一个hits数组用于multi_match查询,第二个hits数组用于mlt查询的结果。 multi_match查询返回100个结果,mlt查询返回最大值8。

这就是我在我的控制器中的search()中处理响应[]的方式

return searchService.search(vm.searchTerms, vm.currentPage).then(function(es_return) {
    var results = es_return.responses;
    var totalItems = es_return.responses[0].hits.total;
    var totalTime = es_return.responses[0].took;
    var numPages = Math.ceil(es_return.responses[0].hits.total / vm.itemsPerPage);
    vm.results.pagination = [];
    vm.results.queries = [];
    for (var i = 0; i < results.length; i++) {
      for (var j = 0; j < results.length; j++) {
      vm.results.totalItems = totalItems;
      console.log(vm.results.totalItems);
      vm.results.queryTime = totalTime;
      vm.results.pagination = searchService.formatResults(es_return.responses[0].hits.hits);//load first 100 results
      vm.results.documents = vm.results.pagination.slice(vm.currentPage, vm.itemsPerPage);
      console.log(vm.results.documents);
      vm.results.mlt = es_return.responses[1].hits.hits;
      }
    }

因为你可以看到我使用嵌套for循环来处理responses array [] - 这是正确的方法吗?我正在加载前100个结果并一次显示10个结果。

我正在使用AngularJS UI Boostrap分页指令。我的ng-change =&#34; changePage&#34; - 只需调用paginate()来执行此操作

vm.paginate = function() {
    var begin = ((vm.currentPage - 1) * vm.itemsPerPage);
    var end = vm.currentPage * vm.itemsPerPage;
    vm.results.documents._source = vm.results.pagination.slice(begin, end);
    console.log(vm.results.documents._source);
  };

唯一没有按预期工作的是multi_match查询的分页,当我从esClient.search()切换到esClient.msearch()并且必须处理responses[]时,它开始了}。我不太确定如何处理响应数组?

更新好的,我想我已经开始明白这一切了。我真的不只是处理像这样的JSON响应,响应:[[hits],] [hits]]

更像是

{response:property: value,property: value, hits:{property: value, property: value}, hits: [{property:value,property:value}]... }

因此两个命中数组都充满了对象。如何正确地迭代这个以便分页也能正常工作?

更新2 好的,经过多次阅读后(希望能更好地理解)...我想我有这个。我终于找到了这个SO answer,而且我处理的数据非常相似所以看起来像angular.forEach会为此工作...我希望。我注意到我的问题与许多其他关于数组和迭代的问题非常类似 - 我猜这就是为什么这个问题没有得到太多牵引力。但是,当我开始工作时,我会在这里发布任何相关信息。

0 个答案:

没有答案