如何使用 Angular JS 排序和选择 json 数组中的前 5 个元素

Posted

技术标签:

【中文标题】如何使用 Angular JS 排序和选择 json 数组中的前 5 个元素【英文标题】:how to sort and select top 5 elements in a json array using angular JS 【发布时间】:2018-01-10 07:00:09 【问题描述】:

我有一个 REST API,它以 JSON 形式返回 Java.util.HashMap 对象。

它有表单中的数据(大约 15-20 个这样的元素):

"entity": 
    "element1": 15,
    "element2": 26,
    "element3": 37,
    "element4": 45

我正在调用 API 并在我的 Angular JS 应用程序中获取此地图,如下所示:

url = 'http://localhost:8080/dummy/';
console.log(url);
$http.get(url).success(function(data) 
    var elements = [];
    var counts = [];
    var mymap = data.entity;
    console.log(mymap);
    Object.keys(mymap).forEach(function(key) 
        elements.push(key);
        counts.push(mymap[key]);
    );
)

接下来,我使用它在 UI 中使用高图表将其显示为条形图:

Highcharts.chart('hc-container', 
chart : 
    type : 'bar'
,
title : 
    text : 'Top 5 element count'
,
xAxis : 
    categories : elements
,
series : [ 
    name : 'count',
    data : counts
 ]
);

html

<body ng-controller="myController">
  <div id="hc-container">Placeholder for chart</div>
</body>

现在它正在显示地图中的所有元素。我只需要在条形图中显示计数最高的前 5 个元素。

我该怎么做?

【问题讨论】:

你能分享你的 HTML 吗? 也添加了 HTML 【参考方案1】:

您可以通过关联的计数值sort() 键和slice() 结果:

let data = 
    "entity": 
      "element1": 1,
      "element2": 2,
      "element3": 3,
      "element4": 4,
      "element5": 5,
      "element6": 6,
      "element7": 7
    
  ,

  mymap = data.entity;


let elements = Object.keys(mymap)
  .sort((a, b) => mymap[b] - mymap[a])
  .slice(0, 5);

let counts = elements.map(key => mymap[key]);

console.log('5 highest counts', JSON.stringify(counts))
console.log('5 highest elements', JSON.stringify(elements))

【讨论】:

.sort((a, b) =&gt; mymap[a] - mymap[b]) 是做什么的?另外,这种排序会基于地图中存在的元素数量吗? 我的错误...固定排序..倒退了。它按关联的计数对键数组进行排序【参考方案2】:

您可以使用 angularJS $filter 服务进行排序和 top n:

(function() 
  var app = angular.module("soDemo", []);
  app.controller("soDemoController", SoDemoController);

  SoDemoController.$inject = ['$scope', '$filter'];

  function SoDemoController($scope, $filter) 
    var vm = 
      counts: [
          name: 'element1',
          count: 15
        ,
        
          name: 'element2',
          count: 26
        ,
        
          name: 'element3',
          count: 37
        ,
        
          name: 'element4',
          count: 45
        
      ]
    ;

    var limitToFilter = $filter('limitTo');
    vm.sortedCounts = limitToFilter($filter('orderBy')(vm.counts, '-count'), 3);
    $scope.vm = vm;
    return;
  
)();
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.2.23/angular.min.js"></script>

<div class="sample" ng-app="soDemo" ng-controller="soDemoController">
  <h2>Counts</h2>
  <pre>vm.counts | json</pre>
  <h2>Sorted Counts (top 3)</h2>
  <pre>vm.sortedCounts | json</pre>
</div>

【讨论】:

【参考方案3】:

Object.keys 一张地图。

const entity = 
  "element1": 99,
  "element2": 15,
  "element3": 26,
  "element4": 37,
  "element5": 45,
  "element6": 2
;

const result = Object.keys(entity).map(key => ( key, value: entity[key] )).sort((elemA, elemB) => 
  if (elemA.value > elemB.value) 
    return -1;
   else if (elemB.value > elemA.value) 
    return 1;
  
  return 0;
).slice(0, 5);
//
// [  key: 'element1', value: 99 ,
//    key: 'element5', value: 45 ,
//    key: 'element4', value: 37 ,
//    key: 'element3', value: 26 ,
//    key: 'element2', value: 15  ]
console.log(result);

只需添加另一个地图或减少最终得到所需格式的结果。

【讨论】:

以上是关于如何使用 Angular JS 排序和选择 json 数组中的前 5 个元素的主要内容,如果未能解决你的问题,请参考以下文章

如何在 angular.js 中设置日期?

Angular JS - 使用地理位置对集合进行排序

如何使用 Node.js 从 Angular 将日期插入 MySQL DATETIME 列?

Angular和Vue.js 深度对比

如何在 Angular.js 选择框中有一个默认选项

带有选择、复选框和单选按钮的 Angular JS 表单