Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   Найти совпадения в тексте (https://javascript.ru/forum/misc/56156-najjti-sovpadeniya-v-tekste.html)

HelloDarkness 01.06.2015 22:23

Найти совпадения в тексте
 
Здравствуйте форумчане, по заданию нужно создать текстовое поле и ввести в него слова через запятую, проанализировать его и вывести результаты по 6 критериям:
Все гласные буквы, которые входят в каждое слово
Все согласные буквы, которые не входят ни в одно слово

Все звонкие согласные буквы, которые входят хотя бы в одно слово
Все глухие согласные, которые не входят хотя бы в одно слово

Все согласные буквы, которые входят только в одно слово
Все глухие согласные буквы, которые не входят только в одно слово

Написано что нужно реализовать при помощи объекта Array и его методов.
Подскажите пожалуйста с помощью каких методов такое возможно реализовать... буду благодарен любой помощи.
Я знаю только один - split - с помощь его я превратил сроку текста в массив из слов, а что дальше делать хз...

рони 01.06.2015 23:21

Цитата:

Сообщение от HelloDarkness
Все гласные буквы, которые входят в каждое слово

создать массив гласных букв -- отфильтровать по всем словам.
то есть кроме массива слов нужно 6 массивов для фильтрации.
можно циклом , можно http://learn.javascript.ru/array-iteration
вы начните.

HelloDarkness 02.06.2015 00:43

Цитата:

Сообщение от рони (Сообщение 373533)
создать массив гласных букв -- отфильтровать по всем словам.
то есть кроме массива слов нужно 6 массивов для фильтрации.
можно циклом , можно http://learn.javascript.ru/array-iteration
вы начните.

Спасибо, но, если я правильно понял, то нам хватит и четырех массивов:
- Гласных
- Согласных
- Звонких согласных
- Глухих согласных
т.к. согласные и глухие по заданию используются дважды

И я не понял как "отфильтровать по всем словам" допустим я имею 2 массива:
var array1 = [мать, отец, сын];
var array2 = [а, у, о, ы, и, э, я, ю, ё, е];
как мне с помощью второго отфильтровать первый по заданным условиям?

рони 02.06.2015 00:53

HelloDarkness,
function blender(letters, words, select) {
    return letters.filter(function(letter) {
        return words.every(function(word) {
            return word.toLowerCase().indexOf(letter.toLowerCase()) != -1 ? select : !select
        })
    })
};
var test = blender(["А", "Я", "О", "Ё", "У", "Ю", "Ы", "И", "Э", "Е"], ["которые", "входят", "каждое", "слово"], true)
alert(test);//буквы которые входят в каждое слово [O]
test = blender(["А", "Я", "О", "Ё", "У", "Ю", "Ы", "И", "Э", "Е"], ["которые", "входят", "каждое", "слово"], false)
alert(test);//буквы которых нет в каждом слове [Ё,У,Ю,И,Э]
test = blender(["А", "Я", "О", "Ё", "У", "Ю", "Ы", "И", "Э", "Е"], test, false)
alert(test);//буквы которые есть хотябы в одном слове [А,Я,О,Ы,Е]

HelloDarkness 02.06.2015 01:11

Цитата:

Сообщение от рони (Сообщение 373545)
HelloDarkness,
function blender(letters, words, select) {
    return letters.filter(function(letter) {
        return words.every(function(word) {
            return word.toLowerCase().indexOf(letter.toLowerCase()) != -1 ? select : !select
        })
    })
};
var test = blender(["А", "Я", "О", "Ё", "У", "Ю", "Ы", "И", "Э", "Е"], ["которые", "входят", "каждое", "слово"], true)
alert(test);//буквы которые входят в каждое слово [O]
test = blender(["А", "Я", "О", "Ё", "У", "Ю", "Ы", "И", "Э", "Е"], ["которые", "входят", "каждое", "слово"], false)
alert(test);//буквы которых нет в каждом слове [Ё,У,Ю,И,Э]

фантастика, спасибо!:dance:

только функция мне не много не понятна, что в ней нужно будет изменить да бы применить к оставшимся двух условиям?
-буквы которые входят/ не входят хотя бы в одно слово
-буквы которые входят/ не входят только в одно слово

тест:
function blender(letters, words, select) {
    return letters.filter(function(letter) {
        return words.some(function(word) {
            return word.toLowerCase().indexOf(letter.toLowerCase()) != -1 ? select : !select
        })
    })
};
var test = blender(["А", "Я", "О", "Ё", "У", "Ю", "Ы", "И", "Э", "Е"], ["которые", "входят", "каждое", "слово"], true)
alert(test);//буквы которые входят в каждое слово [O]
test = blender(["А", "Я", "О", "Ё", "У", "Ю", "Ы", "И", "Э", "Е"], ["которые", "входят", "каждое", "слово"], false)
alert(test);//буквы которых нет в каждом слове [Ё,У,Ю,И,Э]

рони 02.06.2015 01:52

HelloDarkness,
есть буквы которых нет [Ё,У,Ю,И,Э] ни в одном слове -- значит остались буквы которые есть хотябы в одном слове.

смотрите пример выше - добавлено строки 12-13

HelloDarkness 02.06.2015 02:16

Цитата:

Сообщение от рони (Сообщение 373552)
HelloDarkness,
есть буквы которых нет [Ё,У,Ю,И,Э] ни в одном слове -- значит остались буквы которые есть хотябы в одном слове.

смотрите пример выше - добавлено строки 12-13

логично:) с этим пунктом я вроде бы разобрался с помощью смены метода с every на some в третей строке вашего кода.

Подскажите лучше по-поводу последнего пункта:
-Все гласные буквы, которые входят только в одно слово.
Как отфильтровать допустим только первый(0) элемент массива, а не весь массив?

рони 02.06.2015 02:35

HelloDarkness,
наверно так вам будет проще
<!DOCTYPE HTML>

<html>

<head>
  <title>Untitled</title>
  <meta charset="utf-8">
</head>

<body>
<script>
function blender(letters, words, select) {
    return letters.filter(function(letter) {
        var num = words.reduce(function(sum, word) {
            word.toLowerCase().indexOf(letter.toLowerCase()) != -1 && sum++
            return sum
        },0)
        return select(num)
    })
};
var test = blender(["А", "Я", "О", "Ё", "У", "Ю", "Ы", "И", "Э", "Е"], ["которые", "входят", "каждое", "слово"], function(num) {
   return num == 4   //это длина массива слов
})
alert(test);//буквы которые входят в каждое слово [O]
test = blender(["А", "Я", "О", "Ё", "У", "Ю", "Ы", "И", "Э", "Е"], ["которые", "входят", "каждое", "слово"], function(num) {
   return num == 0
})
alert(test);//буквы которых нет в каждом слове [Ё,У,Ю,И,Э]
test = blender(["А", "Я", "О", "Ё", "У", "Ю", "Ы", "И", "Э", "Е"], ["которые", "входят", "каждое", "слово"], function(num) {
   return num > 0
})

alert(test);//буквы которые есть хотябы в одном слове [А,Я,О,Ы,Е]
var test = blender(["А", "Я", "О", "Ё", "У", "Ю", "Ы", "И", "Э", "Е"], ["которые", "входят", "каждое", "слово"], function(num) {
   return num == 3
})
alert(test);//буквы которыx нет только в 1 слове []

</script>
</body>

</html>

рони 02.06.2015 08:35

Цитата:

Сообщение от HelloDarkness
Как отфильтровать допустим только первый(0) элемент массива, а не весь массив?

так вместо ["которые", "входят", "каждое", "слово"] напишите ["которые"]
или [["которые", "входят", "каждое", "слово"] [0]]

HelloDarkness 02.06.2015 10:38

Цитата:

Сообщение от рони (Сообщение 373556)
HelloDarkness,
наверно так вам будет проще
<!DOCTYPE HTML>

<html>

<head>
  <title>Untitled</title>
  <meta charset="utf-8">
</head>

<body>
<script>
function blender(letters, words, select) {
    return letters.filter(function(letter) {
        var num = words.reduce(function(sum, word) {
            word.toLowerCase().indexOf(letter.toLowerCase()) != -1 && sum++
            return sum
        },0)
        return select(num)
    })
};
var test = blender(["А", "Я", "О", "Ё", "У", "Ю", "Ы", "И", "Э", "Е"], ["которые", "входят", "каждое", "слово"], function(num) {
   return num == 4   //это длина массива слов
})
alert(test);//буквы которые входят в каждое слово [O]
test = blender(["А", "Я", "О", "Ё", "У", "Ю", "Ы", "И", "Э", "Е"], ["которые", "входят", "каждое", "слово"], function(num) {
   return num == 0
})
alert(test);//буквы которых нет в каждом слове [Ё,У,Ю,И,Э]
test = blender(["А", "Я", "О", "Ё", "У", "Ю", "Ы", "И", "Э", "Е"], ["которые", "входят", "каждое", "слово"], function(num) {
   return num > 0
})

alert(test);//буквы которые есть хотябы в одном слове [А,Я,О,Ы,Е]
var test = blender(["А", "Я", "О", "Ё", "У", "Ю", "Ы", "И", "Э", "Е"], ["которые", "входят", "каждое", "слово"], function(num) {
   return num == 3
})
alert(test);//буквы которыx нет только в 1 слове []

</script>
</body>

</html>

Не понял как это работает, но похоже он построен на том что мы заранее задаем в коде массив и его длину?
Мне же нужно что бы данные брались из текстового поля...

<input type="text" value="(слова которые введет пользователь, через запятую)" name ="ddata">
<script>
var array = document.ddata.value.split(', ")
</script>
то есть мы получаем массив, но мы не знаем заранее что это за массив и из скольких элементов он будет состоять...


Часовой пояс GMT +3, время: 09:50.