Как вывести повторяющиеся слова из массива в отдельный массив?

175
23 ноября 2021, 09:20

Вот такая проблема:

Есть массив, в который будут попадать строки. В этих строках несколько слов будут повторятся. Эти повторяющиеся слова надо будет убрать в другой массив по одному.

Например:

Из строки "Дом лошадь трактор дом собака", нам надо создать массив в котором будет лежать только слово "дом", потому, что оно повторяется.

Вот такой код я написал, но он мне все слова по одному сует в новый массив

window.onload = function() { 
  function CheckStr(str) { 
	var newStr = []; 
    var words = str.split(' '); 
    
    for (var word of words) { 
      if(words.indexOf(word, 0) !== -1) newStr += word + " "; 
    } 
 
    newStr = newStr.trim(); 
    document.getElementById("result").innerHTML = newStr;             
  } 
 
  CheckStr("Дом лошадь трактор бульдозер дом кухня"); 
}

Answer 1

А проблема в том, что Вы строку разбили на слова, и в строке ищете эти же слова. Естественно они будут совпадать со строкой.

window.onload = function() { 
    function CheckStr(str) { 
        var newStr = []; 
        var words = str.toLowerCase().split(' '); 
 
        var result = words.reduce(function(acc, el) { // Посчитали количество одинаковых слов 
            acc[el] = (acc[el] || 0) + 1; 
            return acc; 
        }, {}); 
 
        Object.keys(result).forEach(function(key, id){ // Если слова повторяются - выводим 
            if(result[key] > 1) newStr += key + " "; 
        }); 
 
        console.log(newStr); 
        document.getElementById("result").innerHTML = newStr; 
 
    } 
 
    CheckStr("Дом лошадь лошадь трактор бульдозер дом кухня"); 
}
<div id="result"></div>

Answer 2

let str = "Дом дом лошадь трактор бульдозер дом кухня кухня"; 
 
let arr = str.split(" "); 
let words = {}; 
// Каждое новое слово будет сохраняться в качестве ключа объекта. 
// А вместо значения - количество подобных слов в строке. 
 
for( let i = 0; i < arr.length; i++ ){ 
  let word = arr[i].toLowerCase(); 
   
  words[word] = ( words[word] ) ? words[word] + 1 : 1; // см. `Тернарный оператор` 
} 
 
console.log( JSON.stringify( Object.entries(words) ) ); 
 
let repeating = Object.entries(words).filter(arr => arr[1] > 1).map(arr => arr[0]); 
 
console.log( repeating.join(", ") );

READ ALSO
vue-nuxt проект с несколькими index.html

vue-nuxt проект с несколькими index.html

Как организовать проект с несколькими точками входа? Чтоб собирались 2 сборки с общими компонентами

64
Как выполнить Node.js код на HTML странице?

Как выполнить Node.js код на HTML странице?

Я создаю веб-приложение на electron и nodejs

149
Почему counter не инкрементируется?

Почему counter не инкрементируется?

Почему в данной конструкции counter не инкрементируется?

172