หลายเงื่อนไขสำหรับ JavaScript .includes () วิธีการ


95

แค่สงสัยว่ามีวิธีการเพิ่มเงื่อนไขหลายอย่างให้กับวิธีการ.

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

ลองนึกภาพเครื่องหมายจุลภาค "หรือ"

ตอนนี้กำลังถามว่าสตริงมี hello, hi หรือ howdy ดังนั้นก็ต่อเมื่อมีเงื่อนไขเดียวเท่านั้นที่เป็นจริง

มีวิธีการทำไหม?


1
orหมายความว่าการแข่งขันอย่างน้อยหนึ่งรายการก็เพียงพอแล้ว
robertklep

แทนที่จะมองหาวิธีการแก้ปัญหาด้วยวิธีการรวมคุณสามารถลองใช้ดัชนีของสิ่งนี้: ['hello', 'hi', 'howdy'].indexOf(str)
Skander Jenhani

คำตอบ:


29

สิ่งนี้ควรใช้งานได้แม้ว่าจะมีเงื่อนไขเดียวและมีเงื่อนไขเพียงข้อเดียวเท่านั้น

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

เพียงแค่ทราบ ทุกคนที่ลองใช้ Google Apps Script จะได้รับ TypeError: stackoverflow.com/questions/51291776/…
Kurt Leadley

193

คุณสามารถใช้.someวิธีการอ้างอิงที่นี่

some()ทดสอบวิธีการไม่ว่าจะเป็นองค์ประกอบอย่างน้อยหนึ่งในอาร์เรย์ผ่านการทดสอบที่ดำเนินการโดยฟังก์ชั่นที่จัดไว้ให้

// 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
หมายเหตุ: some()เป็นวิธีการไม่ใช่ตัวดำเนินการ มิฉะนั้นคำตอบที่ดี
Mitya

จุดที่ถ่าย ขอบคุณ
dinigo

นี่ควรเป็นคำตอบที่ยอมรับ
matebende เมื่อ

26

ด้วยincludes()ไม่ แต่คุณสามารถบรรลุสิ่งเดียวกันกับ REGEX ผ่านtest():

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

หรือถ้าคำนั้นมาจากแหล่งที่มาแบบไดนามิก:

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

แนวทาง REGEX เป็นแนวคิดที่ดีกว่าเพราะช่วยให้คุณจับคู่คำเป็นคำจริงไม่ใช่สตริงย่อยของคำอื่น คุณต้องใช้เครื่องหมายขอบเขตของคำ\bดังนั้น:

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

วิธีนี้จะใช้ไม่ได้หากคำนั้นมีอักขระ regexp พิเศษ นอกจากนี้สิ่งนี้จะไม่เป็นไปตามข้อกำหนดที่ชัดเจนของ OP ที่จับคู่ก็ต่อเมื่อมีการจับคู่กับคำเดียว

17

คุณสามารถทำสิ่งนี้ได้:

const str = "hi, there"

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

console.log(res);

เมื่อใดก็ตามที่ค่าหนึ่งของคุณส่งคืนค่าจริงค่าจะเป็นจริงมิฉะนั้นจะเป็นเท็จ ทำงานได้ดีกับ ES6


OP กล่าวว่า "ถ้ามีข้อเดียวและมีเงื่อนไขเป็นจริงเพียงข้อเดียวเท่านั้น" ตัวอย่างข้อมูลของคุณจะคืนค่าจริงสำหรับสตริงที่มีทั้งสามคำโดยที่ OP ต้องการให้ส่งกลับเท็จ
Dane Brouwer

4

ซึ่งสามารถทำได้โดยใช้บาง / ทุกวิธีของ Array และ RegEx

เพื่อตรวจสอบว่าทุกคำพูดจากรายการ (อาร์เรย์) ที่มีอยู่ในสตริง:

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

ในการตรวจสอบว่ามีคำใด ๆจากรายการ (อาร์เรย์) อยู่ในสตริงหรือไม่:

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

ว้าว. สิ่งนี้ตอบคำถามทั้งสองข้อของฉัน ขอบคุณมาก !!!!
BoundForGlory

2

ไม่ใช่คำตอบที่ดีที่สุดและไม่ใช่คำตอบที่สะอาดที่สุด แต่ฉันคิดว่ามันอนุญาตมากกว่า เช่นถ้าคุณต้องการใช้ตัวกรองเดียวกันสำหรับการตรวจสอบทั้งหมดของคุณ ใช้.filter()งานได้จริงกับอาร์เรย์และส่งคืนอาร์เรย์ที่กรองแล้ว (ซึ่งฉันพบว่าใช้งานง่ายกว่าด้วย)

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

นี่คือตัวเลือกที่ขัดแย้งกัน:

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

ให้คุณทำสิ่งต่างๆเช่น:

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

1

อีกอัน!

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

การขยายต้นแบบดั้งเดิมของสตริง:

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

ให้คุณทำสิ่งต่างๆเช่น:

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

-2

แล้วไง['hello', 'hi', 'howdy'].includes(str)?


1
ไม่มีก็ไม่ได้ทำงาน: ['hello', 'hi', 'howdy'].includes('hello, how are you ?')ผลตอบแทนfalseในขณะที่ OP trueจะขอแก้ปัญหาที่ผลตอบแทน
Basj
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.