javascript - 如何在不改变任何内容的情况下找到数组中最常出现的项目?
问题描述
我想知道如何在不使用 immutable.js 的情况下在纯 javascript 的不可变实现中重构此代码。
var arr1=[3, 'oo', 'oo', 'oo', 2, 3, 'oo', 3, 'oo', 2, 4, 9, 3];
var mf = 1;
var m = 0;
var item;
for (var i=0; i<arr1.length; i++)
{
for (var j=i; j<arr1.length; j++)
{
if (arr1[i] == arr1[j])
m++;
if (mf<m)
{
mf=m;
item = arr1[i];
}
}
m=0;
}
console.log(item+" ( " +mf +" times ) ");
解决方案
看起来您正在尝试查找数组中出现频率最高的项目。用 计数每个元素的重复次数reduce
,并找到最大重复次数。
减少时,请确保每次都为累加器返回一个新对象,以免发生变异。
const arr1 = [3, 'oo', 'oo', 'oo', 2, 3, 'oo', 3, 'oo', 2, 4, 9, 3];
const reps = arr1.reduce((accum, item) => {
const newCount = (accum[item] || 0) + 1;
return { ...accum, [item]: newCount };
}, {});
const maxTimes = Math.max.apply(null, Object.values(reps));
const [recordItem] = Object.entries(reps).find(([, val]) => val === maxTimes);
console.log(recordItem + " ( " + maxTimes +" times ) ");
如果您需要识别与记录匹配的所有filter
项目,请使用而不是find
:
const arr1 = [3, 'oo', 'oo', 'oo', 2, 3, 'oo', 3, 'oo', 2, 4, 9, 3, 3];
const reps = arr1.reduce((accum, item) => {
const newCount = (accum[item] || 0) + 1;
return { ...accum, [item]: newCount };
}, {});
const maxTimes = Math.max.apply(null, Object.values(reps));
const recordItems = Object.entries(reps)
.filter(([, val]) => val === maxTimes)
.map(([key, val]) => key);
console.log(recordItems.join(', ') + " ( " + maxTimes +" times ) ");
推荐阅读
- javascript - 带有动态键的 JS SetInterval 未清除
- node.js - 是否可以在图像保存/上传之前使用 Multer 获取图像尺寸(宽度和高度)
- python - 加入两个表,文件名有额外的字符串,正则表达式从文件名中删除字符串并进行连接
- java - Android Studio 替换了我的 main.dart 文件中的代码
- c# - C#:使用 IQueryable 注入 DbContext 时无法访问 ASP.NET Core 中的已处置对象
- java - 启动 tomcat 失败并出现无效字节码错误
- python - 为什么我的 python 重复功能不起作用?
- sql - 如何执行与实际统计信息相同的查询结果
- azure - azure 中是否有确保默认启用数据库审核的策略
- hadoop - 在配置单元中的 if 子句中使用子查询的替代选项