为了账号安全,请及时绑定邮箱和手机立即绑定

Javascript 中的经典字数统计算法

Javascript 中的经典字数统计算法

潇潇雨雨 2021-09-17 13:43:48
请... 伙计们,我哪里出错了?经典的字数统计算法:给定一个字符串数组,返回一个 Map ,每个不同的字符串都有一个键,值是该字符串在数组中出现的次数。wordCount(["a", "b", "a", "c", "b"]) → {"a": 2, "b": 2, "c": 1}wordCount(["c", "b", "a"]) → {"a": 1, "b": 1, "c": 1}wordCount(["c", "c", "c", "c"]) → {"c": 4}到目前为止我的代码function wordCount(arrayOfStrings) {    const map = {};    const arr = arrayOfStrings;    for (let i = 0; i < arr.length; i++) {        let arr2 = arr.charAt(i);        if (arr.indexOf(arr2) === arr.lastIndexOf(arr2)) {            map.push({                arr: arr2            });        }    }}wordCount(["a", "b", "a", "c", "b"])下面是我要通过的测试test(`Expect the wordCount of ["one", "fish", "two", "fish", "red", "fish", "blue", "fish"] to equal {one: 1, fish: 4, two: 1, red: 1, blue: 1}`, () => {expect(wordCount([ 'one', 'fish', 'two', 'fish', 'red', 'fish', 'blue', 'fish' ])).toEqual({ one: 1, fish: 4, two: 1, red: 1, blue: 1 });});test(`Expect the wordCount of ["str", "hell", "str", "str"] to equal {str: 3, hell: 1}`, () => {expect(wordCount([ 'str', 'hell', 'str', 'str' ])).toEqual({ str: 3, hell: 1 });});test(`Expect the wordCount of ["a", "b", "a", "c", "b"] to equal {"a": 2, "b": 2, "c": 1}`, () => {expect(wordCount([ 'a', 'b', 'a', 'c', 'b' ])).toEqual({ a: 2, b: 2, c: 1 });});test(`Expect the wordCount of [1, "chair", "cane", "chair"] to equal {1: 1, chair: 2, cane: 1}`, () => {expect(wordCount([ 1, 'chair', 'cane', 'chair' ])).toEqual({ 1: 1, chair: 2, cane: 1 });});test(`Expect the wordCount of ["ch", "chair", "cane", "chair", "ai", "ir"] to equal { ch: 1, chair: 2, cane: 1, ai: 1, ir: 1 }`, () => {expect(wordCount([ 'ch', 'chair', 'cane', 'chair', 'ai', 'ir' ])).toEqual({ ch: 1, chair: 2, cane: 1, ai: 1, ir: 1 });});
查看完整描述

3 回答

?
慕盖茨4494581

TA贡献1850条经验 获得超11个赞

就目前而言,您的方法从根本上是错误的。您需要做的就是将数组中的每个字符串添加为一个属性(如果还不是一个属性),如果是,则增加其值。


function wordCount(arrayOfStrings) {

    const map = {};

    for (let i = 0; i < arrayOfStrings.length; ++i) {

      if (arrayOfStrings[i] in map)

        map[arrayOfStrings[i]]++;

      else

        map[arrayOfStrings[i]] = 1;

    }


    return map;

}

该代码检查数组中的每个字符串以查看它是否已经是正在构建的地图(一个普通对象)的一个属性。如果是,则增加该值;如果不是,则创建一个新属性并将其初始化为 1。


使用会更整洁一些.reduce():


function wordCount(arr) {

  return arr.reduce(function(map, word) {

    if (word in map)

      map[word]++;

    else

      map[word] = 1;

    return map;

  }, {});

}


查看完整回答
反对 回复 2021-09-17
?
慕容708150

TA贡献1831条经验 获得超4个赞

最简洁最简单的方法是reduce

const wordCount = arr => arr.reduce((a, c) => ((a[c] = (a[c] || 0) + 1), a), {});


查看完整回答
反对 回复 2021-09-17
?
翻过高山走不出你

TA贡献1875条经验 获得超3个赞

试试这个(基于你的代码):


function wordCount(arrayOfStrings) {

    const map = {};

    const arr = arrayOfStrings;


    for (let i = 0; i < arr.length; i++) {

        map[arr[i]] = (map[arr[i]] || 0) +1;

    }

    return map;

}


查看完整回答
反对 回复 2021-09-17
  • 3 回答
  • 0 关注
  • 232 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信