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

时间:2017-06-11 10:12:37

标签: javascript

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

所以我举个例子:

words = ["a", "hello", "hello", "b", "went", "a"]

我想将其转换为:

words = [{"a" => 2}, {"b" => 1}, {"hello" => 2}, {"went" => 1}]

我已经看到了简单地计算字符串中的一个单词并返回其出现次数的方法,但是如何在创建具有出现次数的哈希数组的同时如何大规模地执行此操作?

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

4 个答案:

答案 0 :(得分:2)

在第一轮中,您可以创建一个具有数组值和出现次数的对象。然后循环它以创建一个对象数组



var words = ["a", "hello", "hello", "b", "went", "a"];
var rObj = {};
var finalArray = [];
words.map(function(currentValue, index) {
  if (rObj.hasOwnProperty(currentValue)) {
    rObj[currentValue] = rObj[currentValue] + 1;
  } else {
    rObj[currentValue] = 1
  }

});
for (var keys in rObj) {
  var obj = {};
  obj[keys] = rObj[keys];
  finalArray.push(obj)
};
console.log(finalArray)




答案 1 :(得分:1)

您可以先使用reduce()计算元素并返回对象,然后使用map()返回对象值数组。

var words = ["a", "hello", "hello", "b", "went", "a"]
var count = words.reduce(function(r, e) {
  if(!r[e]) r[e] = {[e]: 1}
  else r[e][e] += 1
  return r;
}, {})

var result = Object.keys(count).map(e => count[e])
console.log(result)

答案 2 :(得分:1)

对于一个非常大的数组,我建议使用while for循环和普通检查是否存在单词的密钥。如果不为它分配零。稍后递增count对象的属性。

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

var words = ["a", "hello", "hello", "b", "went", "a"],
    w,
    i = words.length,  
    count = Object.create(null),
    result;
    
while (i--) {
    w = words[i];
    if (!count[w]) {
        count[w] = 0;
    }
    count[w]++;
}

result = Object.keys(count).map(function (k) {
    var temp = {};
    temp[k] = count[k];
    return temp;
});

console.log(result);
.as-console-wrapper { max-height: 100% !important; top: 0; }

答案 3 :(得分:0)

不要通过散列来计算中继器。使用while循环可以减少开销。分配超过计算。您将获得5倍数量级的答案。在1/5的时间内从12个单词中随机生成100万个单词。



var wordsArray = ['apple', 'beer', 'cake', 'potato', 'orange', 'monitor', 'program', 'application', 'keyboard', 'javascript', 'gaming', 'network'],
  words = [];
for (i = 0; i < 1000000; i++) {
  words.push(wordsArray[Math.floor(Math.random() * wordsArray.length)]);
}

function getCount(words) {
  var w,
    i = words.length,
    hash = {};
  while (i--) {
    w = words[i];
    if (!hash[w]) {
      hash[w] = 0;
    }
    hash[w]++;
  }
  return hash
}

console.time('Obj-time');
var counts = getCount(words);
array = [];
for (let i in counts) {
  var l = i.length,
    val = counts[i];
  array.push({
    [i]: val * l
  })
}

console.log(array);
console.timeEnd('Obj-time');
&#13;
&#13;
&#13;