beberapa kondisi untuk metode JavaScript .includes ()


95

Hanya ingin tahu, apakah ada cara untuk menambahkan beberapa kondisi ke metode .includes, misalnya:

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

Bayangkan tanda koma "atau".

Ini menanyakan sekarang apakah string berisi halo, hai atau apa kabar. Jadi hanya jika satu, dan hanya satu syarat yang benar.

Apakah ada metode untuk melakukan itu?


1
orakan menyiratkan bahwa setidaknya satu pertandingan sudah cukup.
robertklep

Alih-alih mencari solusi dengan metode include, Anda dapat mencoba indexOf seperti ini: ['hello', 'hi', 'howdy'].indexOf(str)
Skander Jenhani

Jawaban:


29

Itu harus berfungsi bahkan jika satu, dan hanya satu dari ketentuan yang benar:

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));

Hanya sebuah catatan. Siapa pun yang mencoba ini di Google Apps Script akan mendapatkan TypeError: stackoverflow.com/questions/51291776/…
Kurt Leadley

193

Anda dapat menggunakan .somemetode yang dirujuk di sini .

The some()Metode tes apakah setidaknya satu elemen dalam array lulus uji dilaksanakan oleh fungsi yang disediakan.

// 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
Point of note: some()adalah metode, bukan operator. Jika tidak, jawaban yang bagus.
Mitya

Poin diambil. Terima kasih
dinigo

Ini harus menjadi jawaban yang diterima
matebende

26

Dengan includes(), tidak, tetapi Anda dapat mencapai hal yang sama dengan REGEX melalui test():

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

Atau, jika kata-kata tersebut berasal dari sumber dinamis:

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

Pendekatan REGEX adalah ide yang lebih baik karena memungkinkan Anda untuk mencocokkan kata sebagai kata sebenarnya, bukan substring dari kata lain . Anda hanya membutuhkan penanda batas kata \b, jadi:

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

Ini tidak akan berfungsi jika kata-kata mengandung karakter regexp khusus. Selain itu, ini tidak akan memenuhi persyaratan jelas OP yang hanya cocok jika ada kecocokan dengan satu kata.

17

Anda juga bisa melakukan sesuatu seperti ini:

const str = "hi, there"

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

console.log(res);

Setiap kali salah satu penyertaan Anda mengembalikan benar, nilainya akan menjadi benar, jika tidak, itu akan menjadi salah. Ini bekerja dengan baik dengan ES6.


OP berkata, "Jadi hanya jika satu, dan hanya satu syarat yang benar." Cuplikan Anda akan mengembalikan nilai true untuk string yang berisi ketiga kata, di mana OP ingin mengembalikan false.
Dane Brouwer

4

Itu bisa dilakukan dengan menggunakan beberapa / setiap metode Array dan RegEx.

Untuk memeriksa apakah SEMUA kata dari daftar (larik) ada dalam string:

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

Untuk memeriksa apakah SALAH SATU kata dari daftar (larik) ada dalam string:

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

Wow. ini menjawab kedua pertanyaan saya. Terima kasih banyak !!!!
BoundForGlory

2

Bukan jawaban terbaik dan bukan yang terbersih, tapi menurut saya itu lebih permisif. Seperti jika Anda ingin menggunakan filter yang sama untuk semua pemeriksaan Anda. Sebenarnya .filter()bekerja dengan array dan mengembalikan array yang difilter (yang menurut saya lebih mudah digunakan juga).

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

Inilah opsi kontroversial :

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

Memungkinkan Anda melakukan hal-hal seperti:

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

1

Yang lainnya!

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

Memperluas prototipe asli String:

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);
        }
    });
}

Memungkinkan Anda melakukan hal-hal seperti:

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

-2

Bagaimana dengan ['hello', 'hi', 'howdy'].includes(str)?


1
Tidak, itu tidak berhasil: ['hello', 'hi', 'howdy'].includes('hello, how are you ?')kembali false, sedangkan OP meminta solusi yang kembali true.
Basj
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.