从一组数组中,取出某个字段不同的100条数据

背景:在开发一个项目时,需要展示某个市区的公示信息,后端返回了500条数据,500条数据中包含有9个不同的村镇,产品的意思是500条数据只取100条,但100条数据取不同村镇的。所以最开始的直接数组slice截取100个这个想法是不对的,因为可能截取到的是100条村镇一样的数据,因此封装了一个方法,去实现这个需要。

首先简单的看看效果:

    

 

 1 const lodash = require('lodash');
 2 function getList(Arr, groupKey, length) {
 3   let groupMap = lodash.groupBy(Arr, groupKey);
 4   let groupKeyList = Object.keys(groupMap);
 5   let keyIndex = {};
 6   let list = [];
 7   const getItem = index => {
 8     let key = groupKeyList[index];
 9     if (!key) return;
10     if (!keyIndex[key] && keyIndex[key] !== 0) {
11       keyIndex[key] = 0;
12     } else {
13       keyIndex[key]++;
14     }
15     let item = groupMap[key][keyIndex[key]];
16     let countTotal = Object.values(keyIndex).reduce((sum, one) => {
17       return (sum += one);
18     }, 0);
19     let listLength = Arr.length;
20     if (!item && countTotal >= listLength) {
21       return;
22     }
23     if (!item) {
24       index++;
25       if (index > groupKeyList.length - 1) {
26         index = 0;
27       }
28       return getItem(index);
29     }
30     return item;
31   };
32   for (var i = 0; i < length; i++) {
33     let index = i % groupKeyList.length;
34     let item = getItem(index);
35     if (!item) {
36       break;
37     }
38     list.push(item);
39   }
40   return list;
41 }
42 
43 
44 // 测试
45 let list = [
46   { name: 'A1', type: 'A' },
47   { name: 'A4', type: 'A' },
48   { name: 'B1', type: 'B' },
49 ];
50 let res = JSON.stringify(getList(list, 'type', 5), null, 4);
51 console.log(res);

 

posted @ 2022-09-29 10:45  蛙仔  阅读(209)  评论(0编辑  收藏  举报