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。