Javascript中的计数器数组

时间:2014-11-14 05:41:40

标签: 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]);
    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;
    }

3 个答案:

答案 0 :(得分:3)

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

var text_array = ["a1","a1","a2","a3","a2","a4","a1","a5"];
var counts = {};
text_array.forEach(function(el) { 
    counts[el] = counts.hasOwnProperty(el) ? counts[el]+1 : 1;
});
var unique_array = Object.keys(counts);
var counter_array=unique_array.map(function(key) { return counts[key]; })

答案 1 :(得分:1)

您可以使用对象更简单地完成此操作。让值成为对象的键,然后只需增加每个属性的计数。最后,您可以获得一系列唯一键及其值:

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;
});

但第一个例子更容易消化。

答案 2 :(得分:0)

我认为这种方法很难实现。哈希表/关联数组将更容易使用。

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

function get_unique_words(text_array) {

    var hash_table, i, unique_words, keys;

    hash_table = {};
    for(i = 0; i < text_array.length; i++) {
        if(hash_table[text_array[i]] === undefined) {
            hash_table[text_array[i]] = 1;
        } else {
            hash_table[text_array[i]]++;
        }
    }

    // go through the hash table and get all the unique words 
    unique_words = [];
    keys = Object.keys(hash_table);
    for(i = 0; i < keys.length; i++) {
        if(hash_table[keys[i]] === 1) {
            unique_words.push(keys[i]);
        }
    }

    return unique_words.sort();

}

console.log(get_unique_words(
    ['blah', 'blah', 'blah', 'goose', 'duck', 
    'mountain', 'rock', 'paper', 'rock', 'scissors']
));

一些问题和建议:

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

    var x = 1; 
    // vs.
    var x=1;
    

    它使代码更容易阅读,大多数人都不会过度。

  • 在代码块内部缩进代码(例如functionifelsewhilefor等。) 。
    • 这使得更容易阅读代码的控制流程,并有助于防止错误。
  • 使用三个等号(===)除非您故意使用松散的等式。
    • 这将有助于稍后查看您的代码的人(可能是您自己)更好地了解测试应该测试的内容。