如何检查对象数组中某个值的出现次数包括其变体并返回前三个结果

问题描述

我有一个对象数组,其中包含一个项的模型作为其键,我必须按出现的情况返回前 3 个模型,其名称以相同或相似的方式书写,例如,大写,数字之间用破折号或全部在一起。您可以在此处查看数据示例。您将如何创建一个检查出现次数函数

styles[type][variant];

解决方法

检查此代码

//change what key you want to sum
let checkIndex = 'model';
let count = {}
const bikeDB = [{
    id: 43,make: "Gudereit",model: "EC-5",price: 899,userId: 434,date: "2021-05-15"
  },{
    id: 44,make: "Diamant",model: "Beryll",price: 2100,userId: 512,date: "2021-05-03"
  },{
    id: 46,model: "Juna",price: 1100,userId: 432,date: "2021-07-15"
  },{
    id: 51,price: 700,userId: 534,date: "2021-07-13"
  },{
    id: 56,model: "ET-9 evo",price: 1600,userId: 431,date: "2021-06-20"
  },{
    id: 61,model: "BERYLL",price: 900,userId: 412,date: "2021-07-01"
  },{
    id: 66,make: "AwesomeBikes",model: "Dirt Drifter 3000",price: 1900,userId: 399,date: "2021-06-28"
  },{
    id: 67,make: "Kettler",model: "Velossi",price: 1800,userId: 532,date: "2021-07-04"
  },{
    id: 78,model: "ec-5",price: 1200,userId: 416,date: "2021-07-03"
  },{
    id: 81,model: "EC 5",price: 850,userId: 498,date: "2021-04-11"
  },{
    id: 97,make: "Awesome Bikes",model: "Dirt-Drifter-3000",userId: 387,date: "2021-05-20"
  },{
    id: 121,model: "ET 9 evo",{
    id: 178,model: "beryll",price: 2600,userId: 488,date: "2021-06-27"
  },{
    id: 190,model: "Mandara",price: 999,userId: 420,date: "2021-07-17"
  },]

let count_noSpecialCharacter = {};
//this loops and adds in object 
for (let i = 0; i < bikeDB.length; i++) {
  let r = bikeDB[i];
  let key = r[checkIndex].toString().toLowerCase();
  if (key in count) {
    count[key]++;
  } 
  else if (key.replace(/[ -]/mg,"") in count_noSpecialCharacter){
    if(key.replace(/[ ]/mg,"-") in count) {
      count[key.replace(/[ ]/mg,"-")]++;
    }
    if(key.replace(/[-]/mg," ") in count) {
      count[key.replace(/[-]/mg," ")]++;
    }
  } else {
    count[key.replace(/[ ]/mg,"-")] = 1;
    count_noSpecialCharacter[key.replace(/[ -]/mg,"")] = 1;
  }

}

console.log(checkIndex + ":")
console.log(count);

,

可以更通用地编写一个不错的单一函数方法,从而涵盖更广泛的可能用例,例如更灵活地过滤项目的最大数量,甚至允许/启用自定义过滤...

function collectItemsOfSimilarKeyValues(
  arr,key,unifiedValue,unifyValue,maxItemCount = 3
) {
  const list = [];
  const maxCount = arr.length;
  let idx = -1,item,value;
  while ((item = arr[++idx]) && (list.length <= maxItemCount - 1)) {

    if (unifyValue(item[key]) === unifiedValue) {
      list.push(item);
    }
  }
  return list;
}

function unifyModelName(value) {
  return value.replace((/[-\s]+/g),'').toLowerCase();
}

const bikeDB = [
  { id: 43,date: "2021-05-15" },{ id: 44,date: "2021-05-03" },{ id: 46,date: "2021-07-15" },{ id: 51,date: "2021-07-13" },{ id: 56,date: "2021-06-20" },{ id: 61,date: "2021-07-01" },{ id: 66,date: "2021-06-28" },{ id: 67,date: "2021-07-04" },{ id: 78,date: "2021-07-03" },{ id: 81,date: "2021-04-11" },{ id: 97,date: "2021-05-20" },{ id: 121,{ id: 178,date: "2021-06-27" },{ id: 190,date: "2021-07-17" },];


console.log(
  collectItemsOfSimilarKeyValues(
    bikeDB,'model',unifyModelName('ET-9 evo'),unifyModelName,)
);
console.log(
  collectItemsOfSimilarKeyValues(
    bikeDB,unifyModelName('EC-5'),unifyModelName('EC 5'),2,)
);

function isWithinPriceRange(value) {
  return (value >= 700 && value <= 1200);
}
console.log(
  collectItemsOfSimilarKeyValues(
    bikeDB,'price',true,isWithinPriceRange,5,)
);
.as-console-wrapper { min-height: 100%!important; top: 0; }