nhiều điều kiện cho phương thức .includes () JavaScript


96

Chỉ tự hỏi, có cách nào để thêm nhiều điều kiện vào một phương thức .includes, ví dụ:

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

Hãy tưởng tượng các trạng thái dấu phẩy "hoặc".

Bây giờ nó đang hỏi nếu chuỗi chứa hello, hi hoặc howdy. Vì vậy, chỉ khi một, và chỉ một trong các điều kiện là đúng.

Có một phương pháp để làm điều đó?


1
orngụ ý rằng ít nhất một trận đấu là đủ.
robertklep

Thay vì tìm kiếm giải pháp với phương thức ['hello', 'hi', 'howdy'].indexOf(str)
include

@SkanderJenhani ít nhất hãy đọc và thử trước khi bình luận. Đề xuất của bạn sẽ luôn quay lại-1
chankruze

Câu trả lời:


29

Điều đó sẽ hoạt động ngay cả khi một và chỉ một trong các điều kiện là đúng:

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

Chỉ là một ghi chú. Bất kỳ ai thử điều này trong Google Apps Script sẽ nhận được TypeError: stackoverflow.com/questions/51291776/…
Kurt Leadley,

194

Bạn có thể sử dụng .somephương pháp được tham chiếu tại đây .

Các some()thử nghiệm phương pháp dù ít nhất một phần tử trong mảng vượt qua bài kiểm tra được thực hiện bởi các chức năng được cung cấp.

// 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
Điểm lưu ý: some()là phương thức, không phải toán tử. Nếu không, câu trả lời tốt.
Mitya

Đã thực hiện. Cảm ơn bạn
dinigo

Đây phải là câu trả lời được chấp nhận
matebende

26

Với includes(), không, nhưng bạn có thể đạt được điều tương tự với REGEX thông qua test():

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

Hoặc, nếu các từ đến từ một nguồn động:

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

Phương pháp REGEX là một ý tưởng tốt hơn vì nó cho phép bạn đối sánh các từ với nhau như các từ thực tế, không phải là chuỗi con của các từ khác. Bạn chỉ cần đánh dấu ranh giới từ \b, vì vậy:

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

Điều này sẽ không hoạt động nếu các từ chứa các ký tự regexp đặc biệt. Ngoài ra, điều này sẽ không đáp ứng yêu cầu rõ ràng của OP là nó chỉ khớp nếu có một từ khớp với một từ duy nhất .

17

Bạn cũng có thể làm điều gì đó như sau:

const str = "hi, there"

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

console.log(res);

Bất cứ khi nào một trong các bao gồm của bạn trả về true, giá trị sẽ là true, ngược lại, nó sẽ là false. Điều này hoạt động hoàn toàn tốt với ES6.


OP nói, "Vì vậy, chỉ khi một, và chỉ một trong các điều kiện là đúng." Đoạn mã của bạn sẽ trả về true cho một chuỗi chứa cả ba từ, trong đó OP muốn nó trả về false.
Dane Brouwer

4

Điều đó có thể được thực hiện bằng cách sử dụng một số / mọi phương thức của Array và RegEx.

Để kiểm tra xem TẤT CẢ các từ từ danh sách (mảng) có trong chuỗi hay không:

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

Để kiểm tra xem BẤT KỲ từ nào từ danh sách (mảng) có trong chuỗi hay không:

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

Chà. điều này đã trả lời cả hai câu hỏi của tôi. Cảm ơn bạn rất nhiều!!!!
BoundForGlory

2

Không phải câu trả lời hay nhất và cũng không phải câu trả lời rõ ràng nhất, nhưng tôi nghĩ nó dễ dãi hơn. Giống như nếu bạn muốn sử dụng cùng một bộ lọc cho tất cả các séc của mình. Trên thực tế, .filter()hoạt động với một mảng và trả về một mảng đã lọc (tôi cũng thấy dễ sử dụng hơn).

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

Đây là một lựa chọn gây tranh cãi :

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

Cho phép bạn làm những việc như:

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

1

Một cái khác!

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

Mở rộng chuỗi nguyên mẫu gốc:

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

Cho phép bạn làm những việc như:

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

-2

Làm thế nào về ['hello', 'hi', 'howdy'].includes(str)?


1
Không, nó không hoạt động: ['hello', 'hi', 'howdy'].includes('hello, how are you ?')trả về false, trong khi OP đang yêu cầu giải pháp trả về true.
Basj
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.