我正在尝试制作两个数组。唯一数组可以从文本数组中获取元素(无重复),计数器可以计算每个元素的频率。但柜台有问题。
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;
}
答案 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
两次。
var
和i
之前忘记j
将导致它们成为全局变量。
[]
代替函数形式Array
。
new
。它也更容易阅读(IMO)。使用更多空格(它不会咬人),例如等号之前和之后:
var x = 1;
// vs.
var x=1;
它使代码更容易阅读,大多数人都不会过度。
function
,if
,else
,while
,for
等。) 。
===
)除非您故意使用松散的等式。