【问题标题】:Javascript Text Statistic Algorithm ImprovementJavascript文本统计算法改进
【发布时间】:2020-02-03 07:43:49
【问题描述】:

我正在尝试在 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"));

想检查是否有任何其他方法可以解决此问题或需要任何重构

我们将不胜感激。

谢谢

【问题讨论】:

    标签: javascript node.js statistics


    【解决方案1】:

    你可以写得更优雅:

    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'));
    

    【讨论】:

    • 如何迭代以及在哪里使用count、maxDistance方法
    • @user11229655 你可以这样打印:console.table([...getAnalytics('its cool and awesome').entries()].map(([char, { count, maxDistance }]) =&gt; ({ char, count, maxDistance })))。无论如何,您可以阅读有关Map 的信息。除此之外,它还有一个有用的forEach 功能。
    • nave sade 如何在表格中添加下一个,上一个
    • console.table([...getAnalytics('its cool and awesome').entries()].map(([char, { prevs, nexts, count, maxDistance }]) =&gt; ({ char, count, maxDistance, prevs: prevs.join(', '), nexts: nexts.join(', ') })))
    【解决方案2】:

    1) 将字符串转换为字符数组,去掉空,改为大写 2)使用reduce,遍历每个字符并将对象'键'构建为Char值以具有之前,之后和索引。 3) 如果 Char 已经存在于对象中,追加新的统计数据并计算最大距离。

    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'));

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-09-12
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多