JavaScript .includes () yöntemi için birden çok koşul


95

Bir .includes yöntemine birden çok koşul eklemenin bir yolu var mı merak ediyorum, örneğin:

    var value = str.includes("hello", "hi", "howdy");

Virgül "veya" durumlarını hayal edin.

Şimdi dizede merhaba, merhaba veya naber olup olmadığını soruyor . Öyleyse, yalnızca şartlardan biri ve yalnızca biri doğruysa.

Bunu yapmanın bir yöntemi var mı?


1
oren az bir eşleşmenin yeterli olacağı anlamına gelir .
robertklep

['hello', 'hi', 'howdy'].indexOf(str)
İçerme

Yanıtlar:


29

Bu, biri olsa bile işe yaramalı ve koşullardan yalnızca biri doğrudur:

var str = "bonjour le monde vive le javascript";
var arr = ['bonjour','europe', 'c++'];

function contains(target, pattern){
    var value = 0;
    pattern.forEach(function(word){
      value = value + target.includes(word);
    });
    return (value === 1)
}

console.log(contains(str, arr));

Sadece bir not. Bunu Google Apps Komut Dosyasında deneyen herkes bir TypeError alacak: stackoverflow.com/questions/51291776/…
Kurt Leadley

193

Burada.some referans verilen yöntemi kullanabilirsiniz .

some()Yöntem testleri olup dizideki en az bir element testi geçerse Resim fonksiyonunda gerçekleştirilmiştir.

// test cases
var str1 = 'hi, how do you do?';
var str2 = 'regular string';

// do the test strings contain these terms?
var conditions = ["hello", "hi", "howdy"];

// run the tests against every element in the array
var test1 = conditions.some(el => str1.includes(el));
var test2 = conditions.some(el => str2.includes(el));

// display results
console.log(str1, ' ===> ', test1);
console.log(str2, ' ===> ', test2);


3
Dikkat edilecek nokta: some()bir operatör değil, bir yöntemdir. Aksi takdirde, iyi cevap.
Mitya

Alınan nokta. Teşekkür ederim
dinigo

Bu kabul edilen cevap olmalı
matebende

26

İle includes()hayır, ancak aynı şeyi REGEX ile şu yolla elde edebilirsiniz test():

var value = /hello|hi|howdy/.test(str);

Veya kelimeler dinamik bir kaynaktan geliyorsa:

var words = array('hello', 'hi', 'howdy');
var value = new RegExp(words.join('|')).test(str);

REGEX yaklaşımı daha iyi bir fikirdir çünkü kelimeleri diğer kelimelerin alt dizeleri olarak değil, gerçek kelimeler olarak eşleştirmenize izin verir . Sadece kelime sınır işaretine ihtiyacınız var \b, bu yüzden:

var str = 'hilly';
var value = str.includes('hi'); //true, even though the word 'hi' isn't found
var value = /\bhi\b/.test(str); //false - 'hi' appears but not as its own word

Kelimeler özel normal ifade karakterleri içeriyorsa bu işe yaramaz. Ayrıca, bu, OP'nin yalnızca tek bir kelime ile bir eşleşme varsa eşleştiği görünür gereksinimini karşılamayacaktır .

17

Bunun gibi bir şey de yapabilirsiniz:

const str = "hi, there"

const res = str.includes("hello") || str.includes("hi") || str.includes('howdy');

console.log(res);

İçerdiklerinizden biri doğru döndürdüğünde, değer doğru olur, aksi takdirde yanlış olur. Bu, ES6 ile mükemmel bir şekilde çalışıyor.


OP, "Öyleyse, yalnızca biri ve koşullardan yalnızca biri doğruysa." Dedi. Snippet'iniz, üç kelimeyi de içeren bir dize için doğru değerini döndürecektir, burada OP'nin yanlış döndürmesini isteyecektir.
Dane Brouwer

4

Bu, Array ve RegEx'in bazı / her yöntemini kullanarak yapılabilir .

Listedeki (dizi) TÜM kelimelerin dizede olup olmadığını kontrol etmek için:

const multiSearchAnd = (text, searchWords) => (
  searchWords.every((el) => {
    return text.match(new RegExp(el,"i"))
  })
)

multiSearchAnd("Chelsey Dietrich Engineer 2018-12-11 Hire", ["cle", "hire"]) //returns false
multiSearchAnd("Chelsey Dietrich Engineer 2018-12-11 Hire", ["che", "hire"]) //returns true

Listedeki (dizi) herhangi bir kelimenin dizede olup olmadığını kontrol etmek için:

const multiSearchOr = (text, searchWords) => (
  searchWords.some((el) => {
    return text.match(new RegExp(el,"i"))
  })
)

multiSearchOr("Chelsey Dietrich Engineer 2018-12-11 Hire", ["che", "hire"]) //returns true
multiSearchOr("Chelsey Dietrich Engineer 2018-12-11 Hire", ["aaa", "hire"]) //returns true
multiSearchOr("Chelsey Dietrich Engineer 2018-12-11 Hire", ["che", "zzzz"]) //returns true
multiSearchOr("Chelsey Dietrich Engineer 2018-12-11 Hire", ["aaa", "1111"]) //returns false

Vay. bu her iki sorumu da yanıtladı. Çok teşekkür ederim !!
BoundForGlory

2

Ne en iyi cevap ne de en temiz cevap, ama bence daha hoşgörülü. Tüm çekleriniz için aynı filtreleri kullanmak istediğiniz gibi. Aslında .filter()bir dizi ile çalışır ve filtrelenmiş bir dizi döndürür (ben de kullanımı daha kolay buluyorum).

var str1 = 'hi, how do you do?';
var str2 = 'regular string';
var conditions = ["hello", "hi", "howdy"];

// Solve the problem
var res1 = [str1].filter(data => data.includes(conditions[0]) || data.includes(conditions[1]) || data.includes(conditions[2]));
var res2 = [str2].filter(data => data.includes(conditions[0]) || data.includes(conditions[1]) || data.includes(conditions[2]));

console.log(res1); // ["hi, how do you do?"]
console.log(res2); // []


// More useful in this case
var text = [str1, str2, "hello world"];

// Apply some filters on data
var res3 = text.filter(data => data.includes(conditions[0]) && data.includes(conditions[2]));
// You may use again the same filters for a different check
var res4 = text.filter(data => data.includes(conditions[0]) || data.includes(conditions[1]));

console.log(res3); // []
console.log(res4); // ["hi, how do you do?", "hello world"]

2

İşte tartışmalı bir seçenek:

String.prototype.includesOneOf = function(arrayOfStrings) {
  if(!Array.isArray(arrayOfStrings)) {
    throw new Error('includesOneOf only accepts an array')
  }
  return arrayOfStrings.some(str => this.includes(str))
}

Aşağıdakiler gibi şeyler yapmanıza izin vermek:

'Hi, hope you like this option'.toLowerCase().includesOneOf(["hello", "hi", "howdy"]) // True

1

Bir diğeri!

let result

const givenStr = 'A, X' //values separated by comma or space.

const allowed  = ['A', 'B']
const given    = givenStr.split(/[\s,]+/).filter(v => v)

console.log('given (array):', given)

// given contains none or only allowed values:

result = given.reduce((acc, val) => {
  return acc && allowed.includes(val)
}, true)

console.log('given contains none or only allowed values:', result)

// given contains at least one allowed value:

result = given.reduce((acc, val) => {
  return acc || allowed.includes(val)
}, false)

console.log('given contains at least one allowed value:', result)


-1

String yerel prototipini genişletme:

if (!String.prototype.contains) {
    Object.defineProperty(String.prototype, 'contains', {
        value(patterns) {
            if (!Array.isArray(patterns)) {
                return false;
            }

            let value = 0;
            for (let i = 0; i < patterns.length; i++) {
                const pattern = patterns[i];
                value = value + this.includes(pattern);
            }
            return (value === 1);
        }
    });
}

Aşağıdakiler gibi şeyler yapmanıza izin vermek:

console.log('Hi, hope you like this option'.toLowerCase().contains(["hello", "hi", "howdy"])); // True

-2

Nasıl olur ['hello', 'hi', 'howdy'].includes(str)?


1
Hayır, işe yaramıyor: ['hello', 'hi', 'howdy'].includes('hello, how are you ?')geri dönüyor false, OP ise geri dönen bir çözüm istiyor true.
24'te Basj
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.