Найти,из введенных строк, строку с максимальной и минимальной длинной

114
13 января 2021, 11:10

Здравствуйте есть вот такое задание:
Пользователь вводит последовательность строк, состоящих из слов и чисел, разделенных пробелами. Признак конца последовательности – пустая строка. Вывести самые короткие и самые длинные слова в строке
Код ниже.Подскажите ,пожалуйста, как реализовать вывод нескольких строк с максимальной и минимальной длинной(т.е. если в массив входит несколько строк с одинаково короткой или одинаково длинной длиной он вывел их всех,а не только последнюю.) Прошу прощения за говнокод и за глупую просьбу,если она таковой является.Спасибо.

<script> 
  function readStrings(obj) { 
    var str = ' '; 
    while (true) { 
      str = prompt("Введите строку текста (слова через пробел)", ""); 
      if (str == '') break; 
      var words = str.split(' '); 
      for (var i in words) 
        if (words[i] != 0) obj.push(words[i]); 
    } 
  } 
  text = []; 
  readStrings(text); 
  var minnum = text[0].length; 
 
  for (i = 0; i <= text.length - 1; i++) { 
    if (text[i].length <= minnum) { 
      var min = text[i]; 
      minnum = text[i].length; 
    } 
  } 
  var maxnum = text[0].length; 
  for (j = 0; j <= text.length - 1; j++) { 
    if (text[j].length >= maxnum) { 
      var max = text[j]; 
      maxnum = text[j].length; 
    } 
  } 
  document.write(min + '<br>' + text + '<br>' + max) 
</script>

Answer 1

Это несложно сделать, и, думаю, вариантов существует множество. Можете попробовать сделать вот так. Это достаточно многословный вариант, и на самом деле его можно немного уменьшить, но в таком виде, мне кажется, вам будет проще понять, что, когда и зачем мы делаем:

function readStrings() { 
  const words = [] 
 
  while (true) { 
    const str = prompt("Введите строку текста (слова через пробел)", "") 
    if (str == "") { 
      break 
    } 
 
    words.push(...str.split(" ")) 
  } 
 
  return words 
} 
 
// получаем список всех слов 
const words = readStrings() 
 
// группируем слова в объект, где ключ - длина слова, 
// а значение - массив слов с этой длиной 
const wordsByLegth = words.reduce((acc, v) => { 
  if (!acc[v.length]) { 
    acc[v.length] = [] 
  } 
 
  acc[v.length].push(v) 
 
  return acc 
}, {}) 
 
// получаем массив всех длин 
const keysLength = Object.keys(wordsByLegth).map(v => Number(v)) 
 
// получаем минимальную и максимальную длины 
const min = Math.min(...keysLength) 
const max = Math.max(...keysLength) 
 
// выводим все слова, самые короткие и самые длинные 
console.log("Все слова:", words.join(", ")) 
console.log("Самые короткие слова:", wordsByLegth[min].join(", ")) 
console.log("Самые длинные слова:", wordsByLegth[max].join(", "))

READ ALSO
Как сделать первую букву каждого слова заглавной? (регулярные выражения JS)

Как сделать первую букву каждого слова заглавной? (регулярные выражения JS)

У меня есть код, который исправляет первую букву каждого слова в инпуте на заглавную букву, очень полезно для инпутов именТак вот данный код...

134
Объединить в один массив

Объединить в один массив

Как объединить все вложенные массивы в один и если будут повторяющиеся элементы, то убрать ихНапример 12,13 буду встречаться в итоговом едином...

114