Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/457.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript中的计数器数组_Javascript_Arrays - Fatal编程技术网

Javascript中的计数器数组

Javascript中的计数器数组,javascript,arrays,Javascript,Arrays,我正在尝试制作两个数组。唯一数组可以从文本数组中获取元素(无重复),计数器可以计算每个元素的频率。但是柜台有点问题 var unique_array=new Array(); var counter_array=new Array(); var unique=true; for (i=0;i<text_array.length;i++){ if (unique_array.length==0){ unique_array.push(text_array[0]);

我正在尝试制作两个数组。唯一数组可以从文本数组中获取元素(无重复),计数器可以计算每个元素的频率。但是柜台有点问题

var unique_array=new Array();
var counter_array=new Array();
var unique=true;
for (i=0;i<text_array.length;i++){

    if (unique_array.length==0){
    unique_array.push(text_array[0]);
    counter_array.push(1);

    }
    else if(unique_array.length>0&&unique_array.length<=text_array.length){
        for (j=0; j<unique_array.length;j++){
            if (text_array[i]==unique_array[j]){
                counter_array[j]=counter_array[j]+1;// something wrong with the 
                alert(counter_array[j]);
                var unique=false;
            } 
        }
        if (unique==true){
            unique_array.push(text_array[i]);
            counter_array.push[1];
        }
        unique=true;
    }
var unique_array=new array();
var counter_array=新数组();
var-unique=true;

对于(i=0;i0&&unique_array.length而言,我认为这种方法很难实现。哈希表/关联数组更容易使用

使用哈希表(JS中的对象
{}
),您可以将每个单词存储在一个键中,并在再次遇到该单词时增加该键的值。然后,在最后,只需遍历哈希表并收集所有具有小值的键。这些是您的唯一单词

函数获取唯一单词(文本数组){
var哈希_表、i、唯一_字、键;
哈希_表={};
对于(i=0;i
一些问题和建议:

  • 不要对同一变量使用
    var
    两次。
    • 浏览器可以处理它,但为了清楚起见,您应该只声明一次变量
  • 始终本地化循环计数器-在
    i
    j
    之前忘记
    var
    将导致它们成为全局变量。
    • 当您有一个包含大量代码的页面时,这一点很重要—所有全局变量都将始终显示在调试器的监视列表中,这使得调试代码变得更加困难。)
  • 使用数组文字符号
    []
    代替函数形式
    数组
    • 函数形式更长,更容易忘记新的
      。它也更容易阅读(IMO)
  • 使用更多的空格(不会咬人),例如等号前后:

    var x = 1; 
    // vs.
    var x=1;
    
    它使代码更容易阅读,而且大多数人不会做得过火

  • 当代码位于块内时缩进代码(例如,
    函数
    如果
    其他
    用于
    ,等等)。
    • 这样可以更容易地读取代码的控制流,并有助于防止错误
  • 使用三个等号(
    ==
    ),除非您有意使用松散等号。
    • 这将帮助以后查看代码的人(可能是你自己)更好地理解测试应该测试什么

您还可以使用hashmap和一些ES5高阶函数简化代码:

var text_数组=[“a1”、“a1”、“a2”、“a3”、“a2”、“a4”、“a1”、“a5”];
变量计数={};
text_数组.forEach(函数(el){
计数[el]=计数。hasOwnProperty(el)?计数[el]+1:1;
});
var unique_array=Object.keys(计数);

var counter_array=unique_array.map(函数(键){return counts[key];})
您可以更简单地使用对象来实现这一点。让这些值成为对象的键,然后在执行时增加每个属性的计数。最后,您可以获得唯一键及其值的数组:

var text_array = ['foo','bar','foo','fum','fum','foo'];
var i = text_array.length;
var obj = {};

while (i--) {
  if (obj.hasOwnProperty(text_array[i])) {
    obj[text_array[i]]++;
  } else {
    obj[text_array[i]] = 1;
  }
}

console.log('Unique values: ' + Object.keys(obj));   // Unique values: foo,fum,bar
console.log('Value counts:  ' + Object.keys(obj).map(function(v){return obj[v]})); // Value counts:  3,2,1
请注意,输出中计数的排序完全是一致的

正如Jasvir所发布的,您可以使其非常简洁:

var obj = {};
text_array.forEach(function(v) {
  obj.hasOwnProperty(v)? ++obj[v] : obj[v] = 1;
});

但是第一个示例更容易理解。

如果代码有问题,请尝试使用类似的站点。它指出了一些问题,包括右大括号的语法错误。
unique\u array.length>0
在else分支中是多余的,因为除非
length!=0,并且它不能是负数,所以在这一点上它必须是0。