首页 > 解决方案 > 从数组中检索条件数量的对象

问题描述

试图找出如何从对象数组中检索最大数量的记录

假设我有一个这样的对象数组(我已经减少了可读性的数量,但可能有数百个)

[
 { name: 'Roger East',
   kick_off: 2021-10-01T14:00:00.000Z
 },
 { name: 'Anthony Taylor',
   kick_off: 2021-10-01T14:00:00.000Z
 },
 { name: 'Mike Dean',
   kick_off: 2021-09-20T14:00:00.000Z
 },
 { name: 'Roger East',
   kick_off: 2021-09-19T14:00:00.000Z
 },
 { name: 'Mike Dean',
   kick_off: 2021-08-10T14:00:00.000Z
 },
 { name: 'Anthony Taylor',
   kick_off: 2021-08-09T14:00:00.000Z
 }
] 

对于我的示例,我可能只想检索每个唯一的 1、2、3 或 4 条记录name(按最新启动日期排序,尽管它们在数组中按 kick_off 顺序排列,因此可能不需要该逻辑)

因此,假设在我的原始对象中,我有 100 条 Roger East 的记录,90 条 Mike Dean 的记录和 50 条 Anthony Taylor 的记录。我想返回数组中每个名称的前 3 条记录(希望有意义)

所以我最终会得到

[
 { name: 'Roger East',
   kick_off: 2021-10-01T14:00:00.000Z
 },
 { name: 'Roger East',
   kick_off: 2021-10-01T14:00:00.000Z
 },
 { name: 'Roger East',
   kick_off: 2021-09-20T14:00:00.000Z
 },
 { name: 'Mike Dean',
   kick_off: 2021-09-19T14:00:00.000Z
 },
 { name: 'Mike Dean',
   kick_off: 2021-08-10T14:00:00.000Z
 },
 { name: 'Mike Dean',
   kick_off: 2021-08-10T14:00:00.000Z
 },
 { name: 'Anthony Taylor',
   kick_off: 2021-08-09T14:00:00.000Z
 },
 { name: 'Anthony Taylor',
   kick_off: 2021-08-09T14:00:00.000Z
 },
 { name: 'Anthony Taylor',
   kick_off: 2021-08-09T14:00:00.000Z
 }
] 

谢谢

标签: javascriptarraysobject

解决方案


给你:

let data1 = [
 {
   name: 'Roger East',
   kick_off: '2021-10-01T14:00:00.000Z'
 },
 {
   name: 'Anthony Taylor',
   kick_off: '2021-10-01T14:00:00.000Z'
 },
 {
   name: 'Mike Dean',
   kick_off: '2021-09-20T14:00:00.000Z'
 },
 {
   name: 'Roger East',
   kick_off: '2021-09-19T14:00:00.000Z'
 },
 {
   name: 'Mike Dean',
   kick_off: '2021-08-10T14:00:00.000Z'
 },
 { 
   name: 'Anthony Taylor',
   kick_off: '2021-08-09T14:00:00.000Z'
 }
];
let data2 = [
 {
   name: 'Roger East',
   kick_off: '2021-10-01T14:00:00.000Z'
 },
 {
   name: 'Anthony Taylor',
   kick_off: '2021-10-01T14:00:00.000Z'
 },
 {
   name: 'Anthony Taylor',
   kick_off: '2021-10-02T14:00:00.000Z'
 },
 {
   name: 'Mike Dean',
   kick_off: '2021-09-20T14:00:00.000Z'
 },
 {
   name: 'Roger East',
   kick_off: '2021-09-19T14:00:00.000Z'
 },
 {
   name: 'Anthony Taylor',
   kick_off: '2021-10-06T14:00:00.000Z'
 },
 {
   name: 'Anthony Taylor',
   kick_off: '2021-11-07T14:00:00.000Z'
 },
 {
   name: 'Mike Dean',
   kick_off: '2021-08-10T14:00:00.000Z'
 },
 { 
   name: 'Anthony Taylor',
   kick_off: '2021-08-09T14:00:00.000Z'
 },
 {
   name: 'Anthony Taylor',
   kick_off: '2021-10-22T14:00:00.000Z'
 },
 {
   name: 'Anthony Taylor',
   kick_off: '2021-10-24T14:00:00.000Z'
 },
];
const limitEachNameByNumber1 = 1;
const limitEachNameByNumber2 = 3;

function receiveFilteredData(data, limit) {
  let filteredData = [];
  let counter = {};
  
  for (let record of data) {
    if (!counter[record.name]) {
      counter[record.name] = 0;
    }
    
    if (counter[record.name] >= limit) {
      continue;
    }
    
    filteredData.push(record);
    counter[record.name] ++;
  }

  return filteredData;
}

console.log(receiveFilteredData(data1, limitEachNameByNumber1));
console.log(receiveFilteredData(data2, limitEachNameByNumber2));


推荐阅读