Javascript Text Statisti c Улучшение алгоритма - PullRequest
2 голосов
/ 03 февраля 2020

Я пытаюсь решить один алгоритм в Javascript, где пользователю требуется ввести предложение, а затем сделать статистику c в качестве следующего снимка экрана

enter image description here

Я сделал со следующим кодом

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

Хотите проверить, есть ли какой-либо другой способ решения этой проблемы или для любого рефакторинга требуется

Помощь будет оценена.

Спасибо

Ответы [ 2 ]

1 голос
/ 03 февраля 2020

1) Преобразовать строку в массив символов, удалить пустой, изменить на верхний регистр. 2) Использовать Reduce, go через каждый символ и построить «ключи» объекта в виде значений 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'));
1 голос
/ 03 февраля 2020

Вы можете написать это более элегантно:

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'));
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...