javascript: проверить, какая запись массива включена в строку (метод: .some ()) - PullRequest
0 голосов
/ 17 января 2019

Я проверяю строку, если она содержит одну или несколько записей из массива, используя .some () и .include (), как вы можете видеть ниже.

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

Вот мой код:

var hobby = ["sport","art","music"];
var message = "I love sport!";

if(hobby.some(el => message.includes(el))){
    console.log("a hobby is included");

     // tell me which hobby or hobbies here
}

Ответы [ 3 ]

0 голосов
/ 17 января 2019

Метод .filter() можно использовать вместо .some() для получения списка элементов, включенных в строку message. Это может в свою очередь использоваться для отображения хобби в сообщении.

Логика будет включать в себя дополнительную проверку, чтобы убедиться, что длина отфильтрованного списка не пуста до записи результата на консоль:

var hobby = ["sport", "art", "music"];
var message = "I love sport!";

// Use .filter instead of .some
var result = hobby.filter(el => message.includes(el));

// If result not empty, log the result to console
if (result.length > 0) {
  console.log("a hobby or hobbies are included:", result);

  // To find matching indicies
  const matchingIndicies = hobby
    .map((str, index) => ({ str, index }))
    .filter((item) => message.includes(item.str))
    .map((item) => (item.str + ' at index ' + item.index));
 
  console.log("matching indicies:", matchingIndicies)
  // tell me which hobby or hobbies here
}
0 голосов
/ 17 января 2019

Я предпочитаю простой цикл forEach, подобный следующему:

var hobby = ["sport", "art", "music"];
var message = "I love sport!";
var idxs = []
var vals =[]
hobby.forEach(function(val, idx){
  if (message.includes(val))
  {
      idxs.push(idx);
      vals.push(val)
  }
});

if (vals.length !== 0) {
  console.log('You like ' + vals.join(','));
  console.log('Your hobby indices: ' + idxs.join(','));
} else {
  console.log('You Like Nothing!!');
}
0 голосов
/ 17 января 2019

Используйте .filter вместо .some:

var hobby = ["sport", "art", "music"];
const checkMessage = (message) => {
  const hobbies = hobby.filter(word => message.includes(word));
  if (hobbies.length !== 0) {
    console.log('Looks like you like ' + hobbies.join(','));
  } else {
    console.log('No matching hobbies found');
  }
};

checkMessage("I love sport!");
checkMessage("foo bar");
checkMessage("music and art");

Если вам нужны соответствующие знаки, используйте .reduce:

var hobby = ["sport", "art", "music"];
const checkMessage = (message) => {
  const hobbyIndicies = hobby.reduce((a, word, i) => {
    if (message.includes(word)) {
      a.push(i);
    }
    return a;
  }, []);
  if (hobbyIndicies.length !== 0) {
    console.log('Looks like you like indicies ' + hobbyIndicies.join(','));
  } else {
    console.log('No matching hobbies found');
  }
};

checkMessage("I love sport!");
checkMessage("foo bar");
checkMessage("music and art");
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...