Estoy luchando con seguir la lógica.
Estoy creando la siguiente matriz de objetos al ejecutar una cadena dada.
[{"word":"Frank","c":1}, {"word":"Irina","c":1}, {"word":"Frank","c":1}, {"word":"Frank","c":1}, {"word":"Thomas","c":1}]
lo que quiero lograr es:
[{"word":"Frank","c":3}, {"word":"Irina","c":1}, {"word":"Thomas","c":1}]
¿Cuál sería la mejor manera aquí?
Estoy enviando la cadena a esta función y creando la matriz. pero no soy capaz de conseguir lo que quiero.
function words(str) { return str.split(" ").reduce(function(count, word) { if(word.length>2&&isLetter(word)){ data.push({word:word, count: 1}); } }, {}); }
gracias por la ayuda adrian
Puede usar el acumulador de objetos para llevar la cuenta de cada palabra y luego usar Object.values()
para obtener todos los valores.
function words(str) { return Object.values(str.split(" ").reduce((result, word) => { result[word] ??= {word, count: 0}; result[word].count += 1; return result; }, {})); } console.log(words("Frank Irina Frank Frank Thomas"));
.as-console-wrapper { max-height: 100% !important; top: 0; }
Suponiendo que c no siempre es 1 (en cuyo caso puede hacer lo que sugirió la otra publicación y simplemente llevar la cuenta de las palabras), puede hacerlo así, recorriendo los datos y sumando los valores de c en un búfer, usando word como clave para el búfer. Luego asigne los valores del búfer a una matriz final.
const data = [{"word":"Frank","c":1}, {"word":"Irina","c":1}, {"word":"Frank","c":1}, {"word":"Frank","c":1}, {"word":"Thomas","c":1}]; //console.log(data); let buffer = {}; data.forEach(i=>{ let w = i.word; let words = buffer[w] || {word: w, c: 0}; words.c = ic*1 + words.c; buffer[w] = words; }); let final = Object.values(buffer).map(b=>{ return {word: b.word, c: bc}; }); console.log(final);
Esto funcionará para cualquier valor de c:
const data = [{"word":"Frank","c":2}, {"word":"Irina","c":4}, {"word":"Frank","c":1}, {"word":"Frank","c":3}, {"word":"Thomas","c":1}]; //console.log(data); let buffer = {}; data.forEach(i=>{ let w = i.word; let words = buffer[w] || {word: w, c: 0}; words.c = ic*1 + words.c; buffer[w] = words; }); let final = Object.values(buffer).map(b=>{ return {word: b.word, c: bc}; }); console.log(final);