Javascript 计算数组中具有特定名称的条目数,并保存以供以后使用

Javascript 计算数组中具有特定名称的条目数,并保存以供以后使用,javascript,arrays,sorting,count,Javascript,Arrays,Sorting,Count,我正试图找到一种方法来计算此数组中每种类型的条目数: var types = [ "loc_67249556", "loc_52558678", "loc_62658330", "gra_59669755", "gra_59289309" ] 我指的“类型”是每个条目的前三个字母。 我使用for循环数组并提取3个首字母: for (var i = 0; i < types.length; k++) { var tp= types[k].split('_');

我正试图找到一种方法来计算此数组中每种类型的条目数:

var types = [
  "loc_67249556",
  "loc_52558678",
  "loc_62658330",
  "gra_59669755",
  "gra_59289309"
]
我指的“类型”是每个条目的前三个字母。 我使用for循环数组并提取3个首字母:

for (var i = 0; i < types.length; k++) {
    var tp= types[k].split('_');
    tp = tp[0];
}

另外,我总共有51种不同类型的条目,都是从3个字母开始的。

使用
reduce
提取前3个字母,添加到按类型索引的累加器对象中,然后获取该对象的值:

const类型=[
“loc_67249556”,
“loc_52558678”,
“loc_62658330”,
“gra_59669755”,
“gra_59289309”
];
const typeCount=types.reduce((a,str)=>{
const type=str.slice(0,3);
如果(!a[type])a[type]={type,计数:0};
a[type].count++;
返回a;
}, {})

console.log(Object.values(typeCount))
您可以在
reduce()的帮助下尝试此操作。

var类型=[
“loc_67249556”,
“loc_52558678”,
“loc_62658330”,
“gra_59669755”,
“gra_59289309”
];
让op=Object.values(type.reduce)(op,curr)=>{
设温度=当前子温度(0,3);
如果(操作[温度]){
op[temp]['count']++;
}否则{
操作[温度]={
“类型”:临时,
“计数”:1
}
}
返回op;
},{}))
控制台日志(op)您可以使用array.map

var getcount=函数(类型){
var结果=[];
types.map(obj=>{
var键=对象拆分(“”“)[0];
var tempArr=result.filter(item=>item.key==key);
如果(tempArr.length>0){
tempArr[0]。计数=tempArr[0]。计数+1;
}否则{
var tempitem={
计数:1,
钥匙:钥匙
};
结果:推送(临时项目);
}
});
返回结果;
}
变量类型=[
“loc_67249556”,
“loc_52558678”,
“loc_62658330”,
“gra_59669755”,
“gra_59289309”
]
//要得到结果,请调用它
var newArr=getcount(类型);

控制台日志(newArr)如果类型计数与前一作品的某些值存在(或不存在):

var类型=[
“loc_67249556”,
“loc_52558678”,
“loc_62658330”,
“gra_59669755”,
“gra_59289309”
];
变量类型_count=[{type:'bef',qnt:5}];//来自上一个op的值
//或变量类型_count=[];//空的
//使用新值更新类型\u计数并增加以前的计数
type.forEach(函数(elm){
让
tp=elm.split(“”“)[0],
ix=types\u count.findIndex(e=>e.type==tp)
;
如果(ix(a.type>b.type)-1:((b.type>a.type)-1:0));

console.log(types_count);
您也可以使用它进行赋值。a[type]={type,count:a[type]?a[type].count+1:1};是的,这是一个选项,但它会在每次迭代时创建一个新对象。从内存的角度来看,在这种情况下使用扩展语法不是很有效吗?我想两者都可以,不创建更多的中间对象会有一点帮助,但除非有大量数据要处理,否则没有关系(在这种情况下,最好使用
for
循环,它的速度无法被任何东西打败)我可以将
对象.values(typeCount))
添加到稍后要循环的变量中吗?将代码添加到代码片段匹配中。这将使人们更容易看到它的工作:)结果对象
op
的格式不是@RogerHN想要的格式
var types_count = [
  {
    type: "loc",
    qnt: 3
  },
  {
    type: "gra",
    qnt: 2
  }
]