Как найти в одной строке все слова, содержащиеся во второй строке? - PullRequest
2 голосов
/ 22 ноября 2010

Мне нужно проверить соответствие string A на основе того, содержит ли оно все слова в другом string B - в любом порядке.

Итак, допустим, string A это:

one two three four five

И string B является одним из них:

one two three // match!
one three two // match! (order doesn't matter)
one two six // NOT A MATCH! ('six' is not found in string A)
one two three four // match!
one two three four five // match!
one two three four five seven // NOT A MATCH! ('seven' is not found in string A)

Как найти совпадение между string A и string B, только если каждое слово в string B найдено в string A (независимо от порядка слов в любой строке и независимо от того, содержит ли string A дополнительные слова, которых нет в string B)?

Я не знаю, есть ли в jQuery какие-либо специальные функции, которые могли бы помочь с этим, или мне нужно делать это строго с чистым JavaScript?

Ответы [ 4 ]

7 голосов
/ 22 ноября 2010
  1. Разделить строки на массивы слов.
  2. Для каждого слова в string A присвойте obj[word] = true;.
  3. Для каждого слова в string B проверьте, если obj[word] === true;. Если это не так, верните false.
  4. Вернуть истину.

Это должно быть достаточно тривиально, чтобы перевести в код.

1 голос
/ 22 ноября 2010

// Если у клиента есть метод массива каждые , этот метод эффективен -

function commonwords(string, wordlist){
    string= string.toLowerCase().split(/\s+/);
    wordlist= wordlist.toLowerCase().split(/\s+/);
    return wordlist.every(function(itm){
        return string.indexOf(itm)!= -1;
    });
}

commonwords ('один два три четыре пять', 'один дваnine ');

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

Array.prototype.every= Array.prototype.every || function(fun, scope){
    var L= this.length, i= 0;
    if(typeof fun== 'function'){
        while(i<L){
            if(i in this && !fun.call(scope, this[i], i, this)) return false;
            ++i;
        }
        return true;
    }
    return null;
}
Array.prototype.indexOf= Array.prototype.indexOf || function(what, i){
    i= i || 0;
    var L= this.length;
    while(i< L){
        if(this[i]=== what) return i;
        ++i;
    }
    return -1;
}
1 голос
/ 22 ноября 2010
function compare(stringA, stringB) {
    // split for the words
    var aa = stringA.split(/\s+/), ab = stringB.split(/\s+/);
    var ha = {}, hb = {};

    // use a hash of the words
    for (var i = 0; i < aa.length; i ++) ha[aa[i]] = true;
    for (var j = 0; j < ab.length; j ++) hb[ab[j]] = true;

    // compare the two sets
    for (var k in hb) if (!ha.hasOwnProperty(k)) return false;
    return true;
}
0 голосов
/ 22 ноября 2010

Почему бы просто не создать набор слов в строке A (объект со значениями true в JavaScript) и проверить, содержит ли оно каждое слово в строке B?

Как вы определяете слово? string.split("\\s+"); достаточно, или вы делаете что-то более причудливое?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...