He estado analizando muchas preguntas similares, pero ninguna de las soluciones (hasta donde pude encontrar) se aplica a mi caso de uso específico.
Explicación / Situación
He estado registrando mi entrada clave durante las últimas dos semanas. Solo por diversión, estoy experimentando con diseños de teclado personalizados, por lo que quería un gráfico o un mapa de calor para comenzar a reflejar la frecuencia de entrada de mi tecla.
Esta es una muestra de los datos del keylogger:
[left-cmd]sdfdsfs[esc][left-ctrl]e[left-ctrl]xytial -f /var/log/ke[tab][return][up][left][left][left][left][left][del][del]ai[return][left-cmd] [left-cmd][left-cmd]6[del]3[left][left][right][del][del]10[left]a[left]a[esc][left-option] [left-option]gst[left-ctrl]e[left-ctrl]hgst[return]g[left-option] replacepasswordhere[left-option][left-cmd]r[left-cmd][right-shift]c[right-shift]ure[del]Progresión
Mapeé todos los caracteres de los que quiero ver la frecuencia (básicamente todos los caracteres/teclas). Probé algunas cosas que terminaron no siendo realmente útiles. Además, las respuestas a las preguntas del contador de frecuencia de palabras son todas variaciones de esto:
function wordFreq(string) { var words = string.replace(/[.]/g, '').split(/\s/); var freqMap = {}; words.forEach(function(w) { if (!freqMap[w]) { freqMap[w] = 0; } freqMap[w] += 1; }); return freqMap; } La cuestión es que no tengo una separación clara entre mis claves, por lo que sé que un simple .split() no me llevará muy lejos.
Enfoque actual
He estado tratando de encontrar alguna forma de dividir la cadena de texto de entrada en una matriz útil. He pasado horas tratando de hacer esto y casi estoy empezando a odiar la palabra reducir 😂.
No espero una respuesta escrita, solo quiero preguntar si hay una manera de dividir esto de la manera que quiero o tal vez un enfoque completamente diferente, que podría investigar. (Haré mi propia investigación, solo necesito algunos consejos u opiniones de otros desarrolladores para comenzar) Básicamente estoy cegado por la visión de túnel tratando de dividir la cadena como la necesito.
Así es como estoy tratando de que se vea la matriz, teniendo en cuenta una sección de la muestra mencionada al principio:
const keys = ['[left-cmd]', 's', 'd', 'f', 'd', 's', 'f', 's', '[esc]', '[left-ctrl]', 'e', '[left-ctrl]', 'x', 'y', 't', 'i', 'a', 'l',' ', '-', 'f', ' ', '/', 'v', 'a', 'r', '/', 'l', 'o', 'g', '/', 'k', 'e', '[tab]', '[del]', '[return]', '[up]']Estoy leyendo las cadenas que tienen 2 estados posibles: carácter normal o dentro de un carácter de corchete. Si es un char normal, lo coloco como token. Si está dentro de un corchete, lo agrego hasta encontrar un corchete de cierre. Luego coloco eso como una ficha. Hasta el final de la cadena.
var str = "[left-cmd]sdfdsfs[esc][left-ctrl]e[left-ctrl]xytial -f /var/log/ke[tab][return][up][left][left][left][left][left][del][del]ai[return][left-cmd] [left-cmd][left-cmd]6[del]3[left][left][right][del][del]10[left]a[left]a[esc][left-option] [left-option]gst[left-ctrl]e[left-ctrl]hgst[return]g[left-option] replacepasswordhere[left-option][left-cmd]r[left-cmd][right-shift]c[right-shift]ure[del]" function tokenize(str) { var state = "normal"; var tokens = []; var bucket = null; for (var i = 0; i < str.length; i++) { var c = str[i]; if (state == "normal") { if (c == '[') { state = "brackets"; bucket = [] continue; } tokens.push(c); } if (state == "brackets") { if (c == ']') { state = "normal"; tokens.push('[' + bucket.join("") + ']'); continue; } bucket.push(c); } } return tokens; } console.log(tokenize(str))