首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Javascript文本统计算法的改进

Javascript文本统计算法的改进
EN

Stack Overflow用户
提问于 2020-02-03 07:43:49
回答 2查看 79关注 0票数 2

我试图解决Javascript中的一种算法,用户需要输入句子,然后必须按照下面的屏幕截图进行统计

我已经完成了以下代码

代码语言:javascript
复制
class TextAnalytics {

  getAnalytics(sentence) {
    var analyzedResult = {}
    var textArray = new Array();
    const trimmed = sentence.replace(/\s/g, '').toUpperCase()
     for (let i = 0; i < trimmed.length; i++) {
        const currentChar = trimmed[i]
        if (!analyzedResult[currentChar]) {
          analyzedResult[currentChar] = {
            count: 1,
            prevChar: trimmed[i - 1] ? [trimmed[i - 1]] : [],
            nextChar: trimmed[i + 1] ? [trimmed[i + 1]] : [],
            index: [i]
          }
        } else {

          analyzedResult[currentChar].count++
          trimmed[i - 1] &&
            analyzedResult[currentChar].prevChar.push(trimmed[i - 1])
          trimmed[i + 1] &&
            analyzedResult[currentChar].nextChar.push(trimmed[i + 1])
       
          analyzedResult[currentChar].index.push(i)
        }
      }
      return analyzedResult;
  }
 
  getMaxDistance(arr) {
      let max = Math.max.apply(null, arr);
      let min = Math.min.apply(null, arr);
      return max - min;
  }
  
}
var textAnalytics = new TextAnalytics();
console.log(textAnalytics.getAnalytics("its cool and awesome"));

要检查是否有其他解决此问题的方法或重构要求。

我们会感谢你的帮助。

谢谢

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2020-02-03 08:34:16

你可以写得更文雅些:

代码语言:javascript
复制
class CharStats {
    constructor () {
        this.prevs = [];
        this.nexts = [];
        this.indexes = [];
    }

    add (prev, next, index) {
        prev && this.prevs.push(prev);
        next && this.nexts.push(next);
        this.indexes.push(index);

        return this;
    }

    get count () {
        return this.indexes.length;
    }

    get maxDistance () {
        // If the index array is empty, the result will be Infinite.
        // But because the algorithm cannot have a situation where 
        // this class is used without at least one index, this case 
        // need not be covered.
        return Math.max(...this.indexes) - Math.min(...this.indexes);
    }
}

const getAnalytics = sentence =>
    [...sentence.replace(/\s/g, '').toUpperCase()].reduce((map, cur, i, arr) =>
        map.set(cur, (map.get(cur) || new CharStats).add(arr[i - 1], arr[i + 1], i)),
        new Map);

console.log(getAnalytics('its cool and awesome'));
票数 1
EN

Stack Overflow用户

发布于 2020-02-03 10:04:03

1)将字符串转换为字符数组,移除空,改为大写2)使用约简,遍历每个字符,并将对象“键”作为前面、后和索引的char值。3)如果物体中已经存在Char,则追加新的统计量并计算最大距离。

代码语言:javascript
复制
const getAnalytics = str => {
  const caps = Array.from(str.toUpperCase()).filter(x => x.trim());
  return caps.reduce((acc, char, i) => {
      const prepost = { 
        before: caps[i-1] || '', 
        after: caps[i+1] || '',
        index: i
      };
      if (char in acc) {
        const chars = [...acc[char].chars, prepost];
        const mm = chars.reduce((acc, curr) => ({
          max: Math.max(acc.max, curr.index),
          min: Math.min(acc.min, curr.index)
        }), {max: -Infinity, min: Infinity});
        acc[char] = { chars, max_distance: mm.max - mm.min };
      } else {
        acc[char] =  { chars: [prepost], max_distance: 0 };
      }
      return acc;
    }, {});
}

console.log(getAnalytics('its cool and awesome'));

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/60035024

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档