从一组数组中,取出某个字段不同的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);