Javascript 为数组中的数字创建直方图

Javascript 为数组中的数字创建直方图,javascript,Javascript,为数组中的数字创建柱状图,其中x轴表示特定大小的存储桶,y轴使用javascript指示属于特定存储桶的数字数量 我找到了一个解决方案,但输出在不同的轴上 const dict={};//空字典 var min=Number.MAX_值; 常量maxRange=15;//maxRange以上的元素将在同一范围内加入。 //var arr=[2,1,2,101,4,95,3250,4,1,2,2,7,98,123,99]; 常量arr=[1,2,5,3,2,2,1,5,5,6,7,1,8,10,

为数组中的数字创建柱状图,其中x轴表示特定大小的存储桶,y轴使用javascript指示属于特定存储桶的数字数量

我找到了一个解决方案,但输出在不同的轴上

const dict={};//空字典
var min=Number.MAX_值;
常量maxRange=15;//maxRange以上的元素将在同一范围内加入。
//var arr=[2,1,2,101,4,95,3250,4,1,2,2,7,98,123,99];
常量arr=[1,2,5,3,2,2,1,5,5,6,7,1,8,10,11,12,12];
//迭代数组并在映射中设置和更新计数器
arr.forEach(函数(num){
min=Math.min(min,num);//查找min
如果(数值>最大范围){
num=最大范围+1;
}
dict[num]=dict[num]?dict[num]+1:1;
});
console.log(“Num | Count”);
//从最小值到最大值打印数组中每个项目的出现次数

虽然(min很抱歉误解了,现在它应该工作得更好了(除了填充不是完美的):

if(“”.repeat==未定义)improveIE();
const dict={};//空字典
var min=Number.MAX_值;
const maxRange=15;//maxRange以上的元素将在同一范围内加入。
常量配置={
最后一项:5,
描述空间:5,
说明:[“计数”、“数值”],
记录宽度:4
}
//var arr=[2,1,2,101,4,95,3250,4,1,2,2,7,98,123,99];
常量arr=[1,2,5,3,2,2,1,5,5,6,7,1,8,10,11,12,12];
var maxHeight=0,dictLen=0;
//迭代数组并在映射中设置和更新计数器
arr.forEach(函数(num){
min=Math.min(min,num);//查找min
如果(数值>最大范围){
num=最大范围+1;
}
如果(num>config.lastItem)num=config.lastItem+1;
if(dict[num])dict[num]++
否则{
dict[num]=1;
dictLen++;
}
如果(dict[num]>maxHeight)maxHeight=dict[num];
});
用于(变量列=0;列0){
如果(maxHeight>1)行=“”。重复(config.descriptionSpace);
else行=config.description[0].padEnd(config.descriptionSpace);
for(dict中的var i){
如果(maxHeight-dict[i]>0)行+=''。重复(config.recordWidth+1);
else行+=''+'X'.padStart(config.recordWidth-1'')+'';
}
}else if(maxHeight==0){
var cols='+'-'.repeat(config.recordWidth);
行='-'.repeat(config.descriptionSpace)+cols.repeat(dictLen);
}否则{
row=config.description[1].padEnd(config.descriptionSpace);
for(dict中的var i){
迪克特伦--;
var-num;
if(dictLen)num=dict[i].toString();
else num='+'+config.lastItem;
行+=''+num.padStart(config.recordWidth-1'')+'';
}
控制台日志(行);
打破
}
最大高度--;
控制台日志(行);
}
函数改进(){
String.prototype.repeat=函数(num)
{
返回新数组(num+1)。加入(this);
};
String.prototype.padStart=函数padStart(targetLength,padString){
targetLength=targetLength>>0;//如果为数字则截断,或者将非数字转换为0;
padString=String((padString的类型!=“未定义”?padString:”);
如果(this.length>targetLength){
返回字符串(this);
}
否则{
targetLength=targetLength-此长度;
if(targetLength>padString.length){
padString+=padString.repeat(targetLength/padString.length);//附加到原始文件以确保我们的长度超过需要
}
返回padString.slice(0,targetLength)+字符串(this);
}
};
String.prototype.padEnd=函数padEnd(targetLength,padString){
targetLength=targetLength>>0;//如果为数字则截断,或者将非数字转换为0;
padString=String((padString的类型!=“未定义”?padString:”);
如果(this.length>targetLength){
返回字符串(this);
}
否则{
targetLength=targetLength-此长度;
if(targetLength>padString.length){
padString+=padString.repeat(targetLength/padString.length);//附加到原始文件以确保我们的长度超过需要
}
返回字符串(this)+padString.slice(0,targetLength);
}
};

}
很抱歉误会,现在它应该工作得更好了(除了填充不是完美的):

if(“”.repeat==未定义)improveIE();
const dict={};//空字典
var min=Number.MAX_值;
const maxRange=15;//maxRange以上的元素将在同一范围内加入。
常量配置={
最后一项:5,
描述空间:5,
说明:[“计数”、“数值”],
记录宽度:4
}
//var arr=[2,1,2,101,4,95,3250,4,1,2,2,7,98,123,99];
常量arr=[1,2,5,3,2,2,1,5,5,6,7,1,8,10,11,12,12];
var maxHeight=0,dictLen=0;
//迭代数组并在映射中设置和更新计数器
arr.forEach(函数(num){
min=Math.min(min,num);//查找min
如果(数值>最大范围){
num=最大范围+1;
}
如果(num>config.lastItem)num=config.lastItem+1;
if(dict[num])dict[num]++
否则{
dict[num]=1;
dictLen++;
}
如果(dict[num]>maxHeight)maxHeight=dict[num];
});
用于(变量列=0;列0){
如果(maxHeight>1)行=“”。重复(config.descriptionSpace);
else行=config.description[0].padEnd(config.descriptionSpace);
for(dict中的var i){
如果(maxHeight-dict[i]>0)行+=''。重复(config.recordWidth+1);
else行+=''+'X'.padStart(config.recordWidth-1'')+'';
}
}else if(maxHeight==0){
var cols='+'-'.repeat(config.recordWidth);
行='-'.repeat(config.descriptionSpace)+cols.repeat(dictLen);
}否则{
row=config.description[1].padEnd(config.descriptionSpace);
for(dict中的var i)
// build unique object with groups
arr.forEach((num) => {
  min = Math.min(min, num); // find min
  if (num > maxRange) {
    num = maxRange + 1;
  }
  if (num <= 5) {
    dict[num] = dict[num] ? dict[num] + 1 : 1;
  } else {
    dict['5+'] = dict['5+'] ? dict['5+'] + 1 : 1;
  }

});
console.log('Grouped array', dict)

const max = Math.max(...Object.keys(dict).map(key => dict[key]));
const stringSlots = buildStringFunc(Object.keys(dict).length * DISTANCE, '.')

transform(dict, max, stringSlots)

function transform(obj, max, slots) {
  if (max === 0) { return; }
  Object.keys(obj).forEach((key, i) => {
    if (obj[key] === max) {
      slots = slots.replaceAt(i * DISTANCE, 'X');
    }
  })
  console.log(slots);
  transform(obj, --max, slots);
}

// last prints
console.log(buildStringFunc(Object.keys(dict).length * DISTANCE, '-'))
console.log(Object.keys(dict).join(buildStringFunc(DISTANCE - 1, '.')))

function buildStringFunc(end, value) {
  let builder = "";
  for (let i = 0; i < end; i++) {
    builder += value;
  }
  return builder;
}