Проверьте, содержит ли строка подстроку - PullRequest
0 голосов
/ 15 февраля 2019

Этот вопрос будет объяснен на примере.Я попытался использовать команду include для этого, но это не сработало, вы поймете, почему через секунду.

У меня есть 2 переменные:

var Tutor = "Physics, English, History"; /* subjects that a tutor can teach */
var Learner = "Physics, History"; /* subjects in wich a learner want to be tutored */

Когда я используюкоманда:

var n = tutor.includes(Learner);

результат "ложный" из-за порядка (я полагаю).Тем не менее, я хотел бы, чтобы результат был «правдивым», потому что предметы для репетитора включают в себя физику и историю.К сожалению, я не могу ни изменить порядок тем, ни удалить запятые, потому что эти данные основаны на форме из Google.

Буду очень признателен за вашу помощь:)

Ответы [ 6 ]

0 голосов
/ 16 февраля 2019

Логика:

  • при условии, что Tutor и Learner всегда будут разделены запятыми с возможными пробелами
  • при условии, что порядок элементов не имеет значения
  • удалите пробелы и затем разделите их запятой
  • , затем используйте каждые , чтобы определить, присутствуют ли все записи.

var Tutor = "Physics, English, History";
var Learner = "Physics, History";

function contains(csvList, csvSubList) {
    let aList = csvList.replace(/ /g, '').split(',');
    let aSubList = csvSubList.replace(/ /g, '').split(',');
    return aSubList.every( item => aList.includes(item) );
}

let result = contains(Tutor, Learner);
console.log( result );

// example of failure.
result = contains( Tutor, 'Physics, French' );
console.log( result );
0 голосов
/ 15 февраля 2019

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

var Tutor = ["Physics", "English", "History"]; /* subjects that a tutor can teach */
var Learner = ["Physics", "History"]; /* subjects in which a learner want to be tutored */

Теперь вы можете проверить, содержит ли переменная Tutor те же предметы, что и Learner, независимо от порядка (который вас интересовал).

Это можно сделать, просматривая все элементы в массиве Learner и проверяя, содержит ли их массив Tutor:

function TutorContainsAllSubjects() {
  var Tutor = ["Physics", "English", "History"];
  var Learner = ["Physics", "History"];

  var i;
  for (i = 0; i < Learner.length; i++) {
    if (!Tutor.includes(Learner[i])) {
      alert(false);
      return false;
    }
  }

  alert(true);
}
<html>

<head></head>

<body>
  <button onclick="TutorContainsAllSubjects()">Click me</button>
</body>

</html>
0 голосов
/ 15 февраля 2019

Попробуйте сделать строку ученика массивом, разделив его запятой, затем переберите вновь созданный массив с помощью функции every(), затем проверьте, присутствует ли каждое слово в строке преподавателя, если каждое слово присутствует, оно вернетtrue иначе false

 var Tutor = "Physics, English, History"; /* subjects that a 
  the tutor can teach */
 var Learner = "Physics, History"; /* subjects in wich a 
  learner want to be tutored */

  var learnerArray = Learner.split(',');
  let result = learnerArray.every( word => 
  Tutor.includes(word));

   console.log(result)
0 голосов
/ 15 февраля 2019

в основном используя replace, split и every, вы можете получить желаемый результат.

var Tutor = "Physics, English, History";
var Learner = "Physics, History";

function checkIfContains(stringTocheck, stringToMatch) {
  //lets clean the spaces so we can have a better approach.
  const withoutSpaces = stringToMatch.replace(' ', '');
  const arrayFromString = withoutSpaces.split(',');

  //user EVERY to check that everything is included
  const result = arrayFromString.every(entry => stringTocheck.includes(entry))

  return result;

}

const contains = checkIfContains(Tutor, Learner);
console.log(contains)
0 голосов
/ 15 февраля 2019

Это намного проще, если вы разберете данные в массивы, разделив:

 const parse = data => data.split(", ");

Тогда вы можете просто использовать .every и .includes:

 parse(Learner).every(learner => parse(Tutor).includes(learner)) // true
0 голосов
/ 15 февраля 2019

Вы можете использовать indexOf(), который возвращает позицию индекса искомой строки в искомой строке. Если подстрока не найдена, indexOf() возвращает -1.

var Tutor = "Physics, English, History"; /* subjects that a tutor can teach */
var Learner = "Physics, History"; /* subjects in wich a learner want to be tutored */


var n = Tutor.indexOf(Learner) > -1;

console.log(n);

Но, в вашем случае, вместо того, чтобы проводить тестирование строки на возможных строковых значениях, которые разделены запятыми, имеет больше смысла устанавливать массив предметов, которые преподаютсяи затем используйте indexOf() для поиска в массиве совпадения:

var subjects = ["Physics", "English", "History"];
var learner = ["Physics", "History", "Spanish"];

// Loop over the subjects the learner wants to learn
learner.forEach(function(subjectToLearn){
  // Check if the desired subject is taught
  if(subjects.indexOf(subjectToLearn) > -1){
     console.log(subjectToLearn + " is taught.");
  } else {
     console.log(subjectToLearn + " is not taught.");
  }
});
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...