Javascript 在非常大的数组中计算字符串的实例,并将该值添加到哈希值中

Javascript 在非常大的数组中计算字符串的实例,并将该值添加到哈希值中,javascript,Javascript,我在一个数组中有一个非常大的单词数组,我想对所有单词进行计数,并将计数作为一个值添加到每个字符串中 所以我举个例子: words = ["a", "hello", "hello", "b", "went", "a"] 我想将其转换为: words = [{"a" => 2}, {"b" => 1}, {"hello" => 2}, {"went" => 1}] 我已经看到了简单地计算字符串中的一个单词并返回其出现次数的方法,但是在创建一个包含出现次数的哈希数组的同时,

我在一个数组中有一个非常大的单词数组,我想对所有单词进行计数,并将计数作为一个值添加到每个字符串中

所以我举个例子:

words = ["a", "hello", "hello", "b", "went", "a"]
我想将其转换为:

words = [{"a" => 2}, {"b" => 1}, {"hello" => 2}, {"went" => 1}]
我已经看到了简单地计算字符串中的一个单词并返回其出现次数的方法,但是在创建一个包含出现次数的哈希数组的同时,如何大规模地执行此操作呢

之后,我可以删除重复的值,我更感兴趣的是对值进行计数并将计数作为值添加到哈希中。

您可以先使用reduce来计数元素并返回对象,然后映射到返回对象值数组

var words=[a,你好,你好,b,去,a] var count=words.reduceFunction,e{ 如果!r[e]r[e]={[e]:1} 其他r[e][e]+=1 返回r; }, {} var result=Object.keyscount.mape=>count[e] logresult您可以首先使用reduce来计数元素并返回对象,然后映射到返回对象值数组

var words=[a,你好,你好,b,去,a] var count=words.reduceFunction,e{ 如果!r[e]r[e]={[e]:1} 其他r[e][e]+=1 返回r; }, {} var result=Object.keyscount.mape=>count[e]
console.logresult首先,您可以使用数组值和出现次数创建一个对象,然后循环创建一个对象数组

var words=[a,你好,你好,b,去,a]; var rObj={}; var finalArray=[]; words.mapfunctioncurrentValue、索引{ 如果rObj.hasOwnPropertycurrentValue{ rObj[currentValue]=rObj[currentValue]+1; }否则{ rObj[currentValue]=1 } }; 对于rObj中的var键{ var obj={}; obj[keys]=rObj[keys]; finalArray.pushobj };
console.logfinalArray首先,您可以使用数组值和出现次数创建一个对象,然后循环创建一个对象数组

var words=[a,你好,你好,b,去,a]; var rObj={}; var finalArray=[]; words.mapfunctioncurrentValue、索引{ 如果rObj.hasOwnPropertycurrentValue{ rObj[currentValue]=rObj[currentValue]+1; }否则{ rObj[currentValue]=1 } }; 对于rObj中的var键{ var obj={}; obj[keys]=rObj[keys]; finalArray.pushobj };
logfinalArray对于一个非常庞大的数组,我建议使用一段时间的For循环,并简单检查带单词的键是否存在。如果没有,则为其指定零。稍后递增count对象的属性

最后将对象转换为具有所需结构的数组

var words=[a,你好,你好,b,去,a], W i=单词长度, count=Object.createnull, 后果 而我——{ w=单词[i]; 如果!计数[w]{ 计数[w]=0; } 计数[w]++; } 结果=Object.keyscount.mapk函数{ var temp={}; 温度[k]=计数[k]; 返回温度; }; console.logresult;
.作为控制台包装器{max height:100%!important;top:0;}对于一个非常大的数组,我建议使用一段For循环,并简单检查带单词的键是否存在。如果没有,则为其指定零。稍后递增count对象的属性

最后将对象转换为具有所需结构的数组

var words=[a,你好,你好,b,去,a], W i=单词长度, count=Object.createnull, 后果 而我——{ w=单词[i]; 如果!计数[w]{ 计数[w]=0; } 计数[w]++; } 结果=Object.keyscount.mapk函数{ var temp={}; 温度[k]=计数[k]; 返回温度; }; console.logresult;
.as控制台包装器{max height:100%!important;top:0;}不要通过哈希计算中继器。使用while循环以减少开销。作业重于计算。你会得到一个数量级的答案,速度会快5倍。在五分之一的时间内,从12个单词中随机生成100万个单词

var wordsArray=[“苹果”、“啤酒”、“蛋糕”、“土豆”、“橙色”、“显示器”、“程序”、“应用程序”、“键盘”、“javascript”、“游戏”、“网络”], 单词=[]; 对于i=0;i<1000000;i++{ words.pushwordsArray[Math.floorMath.random*wordsArray.length]; } 函数getCountwords{ var w, i=单词长度, 散列={}; 而我——{ w=单词[i]; if!散列[w]{ hash[w]=0; } 散列[w]++; } 返回散列 } 控制台。时间'Obj-time'; var counts=getCountwords; 数组=[]; 因为让我进去算数{ var l=i.长度, val=计数[i]; array.push{ [i] :val*l } } console.logarray;
控制台。timeEnd'Obj-time' 不要通过散列计算中继器。使用while循环以减少开销。作业重于计算。你会得到一个数量级的答案,速度会快5倍。在五分之一的时间内,从12个单词中随机生成100万个单词

var wordsArray=[“苹果”、“啤酒”、“蛋糕”、“土豆”、“橙色”、“显示器”、“程序”、“应用程序”、“键盘”、“javascript”、“游戏”、“网络”], 单词=[]; 对于i=0;i<1000000;i++{ W wordsArray[Math.floorMath.random*wordsArray.length]; } 函数getCountwords{ var w, i=单词长度, 散列={}; 而我——{ w=单词[i]; if!散列[w]{ hash[w]=0; } 散列[w]++; } 返回散列 } 控制台。时间'Obj-time'; var counts=getCountwords; 数组=[]; 因为让我进去算数{ var l=i.长度, val=计数[i]; array.push{ [i] :val*l } } console.logarray;
控制台。timeEnd'Obj-time';欢迎来到StackOverflow。请记住,SO不是代码编写服务。因此,请提供您到目前为止所尝试的代码。我的坏消息,将很快在这里放入一些代码。欢迎使用StackOverflow。请记住,SO不是代码编写服务。因此,请提供您迄今为止所尝试的代码。我的坏,将在这里很快放一些代码。减少是一个不错的选择。尽管这取决于数组的大小,但您可能希望使用for循环来实现它?r[e]+=1:r[e]=1;返回r;内部语言。减少?它将保存地图调用。还是我错了?@gus27 Op想要得到一个对象数组。reduce是个不错的选择。尽管这取决于数组的大小,但您可能希望使用for循环来实现它?r[e]+=1:r[e]=1;返回r;内部语言。减少?它将保存地图调用。还是我错了?@gus27 Op想要一组对象作为结果。有没有一种方法可以像分配任务一样使用地图来优化速度?或者我的假设是错误的?@Arrow,至少,你需要先尝试这两种方法,但我认为一个对象更快,因为它只有字符串作为键,而Map可以有任何类型的键。有没有一种方法可以像赋值一样使用Map来优化速度?或者我的假设是错误的?@Arrow,至少,您需要先尝试这两种方法,但我认为对象更快,因为它只有字符串作为键,而Map可以有任何类型的键。