Javascript 词频计数,使用标准属性修复错误

Javascript 词频计数,使用标准属性修复错误,javascript,arrays,Javascript,Arrays,我正在尝试构建一个javascript函数,该函数将计算输入数组中每个单词的出现次数 例如: 输入 输出: "a":1 "booster":2 "constructor":1 "adam":4 输出应该是相同的 我是javascript新手,我尝试使用dict。但是对象有一个名为“构造函数”的属性,所以cnt[“构造函数”]似乎不起作用 以下是我的代码和结果: var cnt={}; console.log("constructor"); for(var i=0;i<a.length;

我正在尝试构建一个javascript函数,该函数将计算输入数组中每个单词的出现次数

例如:

输入

输出:

"a":1
"booster":2
"constructor":1
"adam":4
输出应该是相同的

我是javascript新手,我尝试使用dict。但是对象有一个名为“构造函数”的属性,所以cnt[“构造函数”]似乎不起作用

以下是我的代码和结果:

var cnt={};
console.log("constructor");

for(var i=0;i<a.length;++i)
{
    if(! (a[i] in cnt))
        cnt[a[i]]=0;
    else
        cnt[a[i]]+=1;
}

for(var item in cnt)
    console.log(item+":"+cnt[item]);
var cnt={};
console.log(“构造函数”);
对于(var i=0;i
背后的想法是

  • 使用
    reduce
    实现优雅
  • 使用
    +m[e]
    m[e]
    转换为一个数字,以避免
    构造函数
    (或
    toString
    )问题

您也可以通过初始化[]作为初始累加器来创建数组

var fruits = ['apple', 'orange', 'grape', 'apple'].reduce((countFruits,currentFruit)=>{
  if(typeof countFruits[currentFruit]!=="undefined"){
    countFruits[currentFruit] = countFruits[currentFruit]+1
    return countFruits
  }
  countFruits[currentFruit] = 1
  return countFruits
},[])
console.log(fruits) 

有趣的问题。实际上,不是盲目的投票,而是尝试解决OP问题。如果他尝试了什么,它是不是很重要?我不知道为什么这个问题被否决了。看来,数组不能支持与C++中的map一样的用法,因为属性。@ dfsq我同意,但是,更容易理解实际的问题。lem提供了一些代码。@Pinal,我已经编辑了我的问题并添加了代码。@Pinal。这个问题已经回答了。如果你有更好的答案,希望能看到你的答案。如果你记录了结果的构造函数属性,你会发现一个奇怪的“1”添加到数组的构造函数中。这正是关键所在。我尝试过使用数组。你知道javascript是否有map吗?@Booster因为
+“constructor”
是NaN,所以
(+“constructor”| 0)
0
@Booster别担心,你有3个支持者:
+3/-8
:D@Booster我同意你的看法(顺便说一句,答案很有趣),这就是我投票的原因。下次请注意发布准备充分且详细的问题:)
function count(arr){
  return arr.reduce(function(m,e){
    m[e] = (+m[e]||0)+1; return m
  },{});
}
var arr = ['apple', 'orange', 'grape', 'apple'];
var initialValue = {};

var result = arr.reduce(function(accumulator, curr, idx, arr) {
    if (Object.hasOwnProperty.call(accumulator, curr)) {   // does current exist as key on initialValue object?
        accumulator[curr]++;
    } else {    // no key for current on initialValue object
        accumulator[curr] = 1;
    }
    return accumulator;
}, initialValue);

console.log(result);
var fruits = ['apple', 'orange', 'grape', 'apple'].reduce((countFruits,currentFruit)=>{
  if(typeof countFruits[currentFruit]!=="undefined"){
    countFruits[currentFruit] = countFruits[currentFruit]+1
    return countFruits
  }
  countFruits[currentFruit] = 1
  return countFruits
},[])
console.log(fruits)