একটি স্ট্রিংয়ে জাভাস্ক্রিপ্টে সাবস্ট্রিংয়ের একটি অ্যারে থেকে পাঠ্য রয়েছে কিনা তা কীভাবে পরীক্ষা করবেন?


163

অনেকটাই অকপট. জাভাস্ক্রিপ্টে, আমাকে পরীক্ষা করতে হবে যে কোনও স্ট্রিংয়ে অ্যারেতে থাকা কোনও সাবস্ট্রিং রয়েছে contains


map()নতুন এইচটিএমএল 5-জাভাস্ক্রিপ্ট-সংস্করণে কোনও ফাংশন নেই? আমার মনে আছে সেই বিষয়ে কিছু পড়েছি ...
মার্টিন হেনিংস

@ মার্টিন: ভালো কথা, mapএতটা নয় somesomeসাহায্য করবে, কিন্তু আপনি এটি একটি ফাংশন পাস করতে হবে।
টিজে ক্রাউডার

উত্তর:


222

অন্তর্নির্মিত কিছুই নেই যা এটি আপনার জন্য করবে, আপনাকে এটির জন্য একটি ফাংশন লিখতে হবে।

আপনি যদি জানেন যে স্ট্রিংগুলিতে নিয়মিত প্রকাশের ক্ষেত্রে বিশেষ কোনও অক্ষর না থাকে তবে আপনি কিছুটা এমন প্রতারণা করতে পারেন:

if (new RegExp(substrings.join("|")).test(string)) {
    // At least one match
}

... যা একটি নিয়মিত প্রকাশ তৈরি করে যা এটি একটি সিরিজ আপনি যে সাবস্ট্রিংগুলি সন্ধান করছেন (যেমন, one|two) এবং সেগুলির কোনওটির সাথে ম্যাচ আছে কিনা তা পরীক্ষা করে দেখার জন্য বিকল্প তৈরি করে তবে সাবস্ট্রিংগুলিতে যদি কোনও অক্ষর থাকে যা বিশেষ রেজেক্সেসে ( *, [ইত্যাদি), আপনাকে প্রথমে সেগুলি থেকে বাঁচতে হবে এবং তার পরিবর্তে আপনি কেবল বিরক্তিকর লুপটি করা ভাল।

সরাসরি উদাহরণ:


প্রশ্নের এক মন্তব্যে মার্টিনArray.prototype.map ECMAScript5 তে নতুন পদ্ধতি সম্পর্কে জিজ্ঞাসা করেছেন ।mapএতটা সাহায্য নয়, তবে someহ'ল:

if (substrings.some(function(v) { return str.indexOf(v) >= 0; })) {
    // There's at least one
}

সরাসরি উদাহরণ:

আপনার কাছে এটি কেবলমাত্র ECMAScript5- অনুবর্তী বাস্তবায়নের মধ্যে রয়েছে, যদিও এটি পলিফিলের পক্ষে ক্ষুদ্র।


2020-এ আপডেট করুন : someউদাহরণটি তীর ফাংশন (ES2015 +) দিয়ে আরও সহজ হতে পারে এবং আপনি এটির includesপরিবর্তে ব্যবহার করতে পারেনindexOf :

if (substrings.some(v => str.includes(v))) {
    // There's at least one
}

সরাসরি উদাহরণ:

বা এমনকি bindএটি নিক্ষেপ , যদিও আমার জন্য তীর ফাংশন অনেক বেশি পঠনযোগ্য:

if (substrings.some(str.includes.bind(str))) {
    // There's at least one
}

সরাসরি উদাহরণ:


2
"মনে মনে, এটি কিছু ওভারহেডের অর্থ ..." তবে কিছু করার নেই
টিজে ক্রাউডার

'|': ব্যতীত সমস্ত রেজেক্স অক্ষর মুছে ফেলে আপনি উপরের সমাধানটি প্রসারিত করতে পারেন new RegExp(substrings.join("|").replace(/[^\w\s^|]/gi, '')).test(string)
ব্যবহারকারী 700

ইনডেক্সফের ব্যবহার খুব ঝাপসা হতে পারে এবং একটি বিজোড় ফলাফল পেতে পারে। এটি সহজেই সমান অপারেটরটি ব্যবহার করে স্ট্রিংয়ের সাথে মেলে। যেমন ('disconnect'.indexOf('connect') >= 0) === trueতবে('disconnect' === 'conenct') === false
কাইলওয়েলসবি

@ হাফলকিউব: হাহ? আমি তোমাকে বুঝতে পারছি না, আমি ভয় পাচ্ছি উপরের উত্তরে কিছুই প্রস্তাব দেয় না যে 'disconnect' === 'connect'কিছুই হবে false। এছাড়াও, indexOfঅস্পষ্ট নয়, এটি খুব স্পষ্টভাবে সংজ্ঞাযুক্ত।
টিজে ক্রাউডার

indexOf উভয় মিলবে disconnect এবং connectযেখানে আমি অভিজ্ঞতার সাথে দেখা করেছি, এটি দুটি ভিন্ন ক্ষেত্রে আমি শর্তাধীন ফলাফলগুলি ফিরিয়ে দিতে চাই।
কাইলওয়েলসবি

54
var yourstring = 'tasty food'; // the string to check against


var substrings = ['foo','bar'],
    length = substrings.length;
while(length--) {
   if (yourstring.indexOf(substrings[length])!=-1) {
       // one of the substrings is in yourstring
   }
}

50

এক লাইন সমাধান

substringsArray.some(substring=>yourBigString.includes(substring))

true\falseসাবস্ট্রিং হলে ফিরে আসেexists\does'nt exist

ES6 সমর্থন প্রয়োজন


তীর ফাংশনগুলি ব্যবহার করে দুর্দান্ত সমাধান
গেরিলারাডিও

7
বাচ্চারা ... আমি যখন ছোট ছিলাম তখন আমাদের এই জিনিসগুলি 'ফর' লুপগুলি ব্যবহার করতে হয়েছিল এবং আপনাকে একাধিক লাইন ব্যবহার করতে হবে এবং জানতে হবে যে আপনার অ্যারেটি 1 বা শূন্য ভিত্তিক ছিল, হ্যাঁ ... আপনি অর্ধেক সময় পেয়েছিলেন এটি ভুল এবং ডিবাগ করতে হয়েছিল এবং 'i' নামক একটি সামান্য বাগারের সন্ধান করতে হয়েছিল।
এমার্কস

25
function containsAny(str, substrings) {
    for (var i = 0; i != substrings.length; i++) {
       var substring = substrings[i];
       if (str.indexOf(substring) != - 1) {
         return substring;
       }
    }
    return null; 
}

var result = containsAny("defg", ["ab", "cd", "ef"]);
console.log("String was found in substring " + result);

1
বুঝতে সহজ!
ড্যারিল এইচ

এছাড়াও এটি স্ট্রিংয়ের শব্দের প্রথম উপস্থিতিটি দেয় যা খুব সহায়ক। শুধু সত্য / মিথ্যা নয়।
কাই নোক

20

গুগলিং লোকদের জন্য,

এর শক্ত উত্তর হওয়া উচিত।

const substrings = ['connect', 'ready'];
const str = 'disconnect';
if (substrings.some(v => str === v)) {
   // Will only return when the `str` is included in the `substrings`
}

2
বা সংক্ষিপ্ত: যদি (substrings.some (v => ভি === স্ট্র)) {
কোফিফাস

10
নোট করুন যে এটি কিছুটা আলাদা প্রশ্নের উত্তর, যা জিজ্ঞাসা করে যে স্ট্রিংটিতে সাবস্ট্রিংগুলির একটি অ্যারে থেকে পাঠ্য রয়েছে কিনা । এই কোডটি সাবস্ট্রিংগুলির মধ্যে একটি স্ট্রিং কিনা তা পরীক্ষা করে। আমি মনে করি "ধারণাগুলি" বলতে কী বোঝায় তা নির্ভর করে।
fcrick

8
var str = "texttexttext";
var arr = ["asd", "ghj", "xtte"];
for (var i = 0, len = arr.length; i < len; ++i) {
    if (str.indexOf(arr[i]) != -1) {
        // str contains arr[i]
    }
}

সম্পাদনা: যদি পরীক্ষার ক্রমটি বিবেচনা না করে তবে আপনি এটি ব্যবহার করতে পারেন (কেবলমাত্র একটি লুপ ভেরিয়েবল সহ):

var str = "texttexttext";
var arr = ["asd", "ghj", "xtte"];
for (var i = arr.length - 1; i >= 0; --i) {
    if (str.indexOf(arr[i]) != -1) {
        // str contains arr[i]
    }
}

আপনার প্রথম উদাহরণটির lenপরিবর্তনশীল প্রয়োজন নেই , কেবল পরীক্ষা করুন i < arr.length
গ্রেজেজ

3

যদি অ্যারেটি বড় না হয় তবে আপনি পৃথকভাবে প্রতিটি স্ট্রিংয়ের বিরুদ্ধে স্ট্রিংটি লুপ করতে এবং পরীক্ষা করতে পারেন indexOf()। বিকল্প হিসাবে আপনি সাবস্ট্রিংগুলির সাথে বিকল্প হিসাবে একটি নিয়মিত প্রকাশ তৈরি করতে পারেন যা আরও দক্ষ হতে পারে বা নাও হতে পারে।


ধরা যাক আমাদের 100 টি সাবস্ট্রিংয়ের একটি তালিকা রয়েছে। কোন উপায়ে আরও দক্ষ হবে: রেজিপ্স্প বা লুপ?
দিয়োরবেক সাদুল্লায়েভ

3

অনুসন্ধান স্ট্রিং বা অনুসন্ধানের স্ট্রিংগুলির একটি অ্যারে ব্যবহার করে ট্যাগ বা কীওয়ার্ডগুলির একটি অ্যারে অনুসন্ধান করার জন্য জাভাস্ক্রিপ্ট ফাংশন। ( ES5 কিছু অ্যারে পদ্ধতি এবং ES6 তীর ফাংশন ব্যবহার করে )

// returns true for 1 or more matches, where 'a' is an array and 'b' is a search string or an array of multiple search strings
function contains(a, b) {
    // array matches
    if (Array.isArray(b)) {
        return b.some(x => a.indexOf(x) > -1);
    }
    // string match
    return a.indexOf(b) > -1;
}

ব্যবহারের উদাহরণ:

var a = ["a","b","c","d","e"];
var b = ["a","b"];
if ( contains(a, b) ) {
    // 1 or more matches found
}

2

এমন নয় যে আমি আপনাকে পরামর্শ দিয়েছি যে আপনি গিয়ে Stringপ্রোটোটাইপটি প্রসারিত / প্রসারিত করুন , তবে আমি এটি করেছি:

String.prototype.includes ()

String.prototype.includes = function (includes) {
    console.warn("String.prototype.includes() has been modified.");
    return function (searchString, position) {
        if (searchString instanceof Array) {
            for (var i = 0; i < searchString.length; i++) {
                if (includes.call(this, searchString[i], position)) {
                    return true;
                }
            }
            return false;
        } else {
            return includes.call(this, searchString, position);
        }
    }
}(String.prototype.includes);

console.log('"Hello, World!".includes("foo");',          "Hello, World!".includes("foo")           ); // false
console.log('"Hello, World!".includes(",");',            "Hello, World!".includes(",")             ); // true
console.log('"Hello, World!".includes(["foo", ","])',    "Hello, World!".includes(["foo", ","])    ); // true
console.log('"Hello, World!".includes(["foo", ","], 6)', "Hello, World!".includes(["foo", ","], 6) ); // false


2

টিজে ক্রাউডারের সমাধান থেকে আঁকতে, আমি এই সমস্যাটি মোকাবেলায় একটি প্রোটোটাইপ তৈরি করেছি:

Array.prototype.check = function (s) {
  return this.some((v) => {
    return s.indexOf(v) >= 0;
  });
};

2
substringsArray.every(substring=>yourBigString.indexOf(substring) === -1)

সম্পূর্ণ সহায়তার জন্য;)


2

সেরা উত্তর এখানে: এটি ক্ষেত্রেও সংবেদনশীল

    var specsFilter = [.....];
    var yourString = "......";

    //if found a match
    if (specsFilter.some((element) => { return new RegExp(element, "ig").test(yourString) })) {
        // do something
    }

1

আন্ডারস্কোর.জেএস বা লড্যাশ.জেএস ব্যবহার করে, আপনি স্ট্রিংগুলির একটি অ্যারেতে নিম্নলিখিতটি করতে পারেন:

var contacts = ['Billy Bob', 'John', 'Bill', 'Sarah'];

var filters = ['Bill', 'Sarah'];

contacts = _.filter(contacts, function(contact) {
    return _.every(filters, function(filter) { return (contact.indexOf(filter) === -1); });
});

// ['John']

এবং একটি একক স্ট্রিং এ:

var contact = 'Billy';
var filters = ['Bill', 'Sarah'];

_.every(filters, function(filter) { return (contact.indexOf(filter) >= 0); });

// true

1

এটি সুপার দেরি হয়ে গেছে, তবে আমি কেবল এই সমস্যায় পড়েছি। আমার নিজের প্রকল্পে আমি স্ট্রিংটি অ্যারেতে ছিল কিনা তা পরীক্ষা করতে নিম্নলিখিতটি ব্যবহার করলাম:

["a","b"].includes('a')     // true
["a","b"].includes('b')     // true
["a","b"].includes('c')     // false

এইভাবে আপনি পূর্বনির্ধারিত অ্যারে নিতে পারেন এবং এতে কোনও স্ট্রিং রয়েছে কিনা তা পরীক্ষা করতে পারেন:

var parameters = ['a','b']
parameters.includes('a')    // true

1

টিজে ক্রাউডারের উত্তরে বিল্ডিং

অন্তত সাবস্ট্রিংগুলির মধ্যে একটির "অন্তত একবার" উপস্থিতি পরীক্ষা করার জন্য রেজিপ্লেক্স ব্যবহার করে পালানো।

function buildSearch(substrings) {
  return new RegExp(
    substrings
    .map(function (s) {return s.replace(/[.*+?^${}()|[\]\\]/g, '\\$&');})
    .join('{1,}|') + '{1,}'
  );
}


var pattern = buildSearch(['hello','world']);

console.log(pattern.test('hello there'));
console.log(pattern.test('what a wonderful world'));
console.log(pattern.test('my name is ...'));


1

আপনি যদি ফাঁকা স্থান বা অন্য কোনও সাধারণ চরিত্র দ্বারা পৃথক পূর্ণ "শব্দের" সমন্বিত সাবস্ট্রিংগুলির দীর্ঘ তালিকা নিয়ে কাজ করছেন, আপনি নিজের অনুসন্ধানে কিছুটা চালাক হতে পারেন।

প্রথমে আপনার স্ট্রিংটিকে এক্স, তারপরে এক্স + 1, তারপরে এক্স + 2, ..., ওয়াই পর্যন্ত এক্স ভাগ করে নিন এবং এক্সটি এবং ওয়াইটি আপনার স্ট্রিংয়ে যথাক্রমে কয়েকটি এবং বেশিরভাগ শব্দের সাথে শব্দের সংখ্যা হওয়া উচিত। উদাহরণস্বরূপ, যদি এক্স 1 হয় এবং ওয়াই 4 হয়, "আলফা বিটা গামা ডেল্টা" হয়ে যায়:

"আলফা" "বিটা" "গামা" "ডেল্টা"

"আলফা বিটা" "বিটা গামা" "গামা ডেল্টা"

"আলফা বিটা গামা" "বিটা গামা ডেল্টা"

"আলফা বিটা গামা ডেল্টা"

যদি এক্স 2 এবং Y 3 হয়, তবে আপনি প্রথম এবং শেষ সারিটি বাদ দিতে পারেন।

স্ট্রিং তুলনার তুলনায় অনেক দ্রুত আপনি যদি কোনও সেট (বা মানচিত্র) এ সন্নিবেশ করান তবে এখন আপনি এই তালিকায় দ্রুত অনুসন্ধান করতে পারেন।

খারাপ দিকটি হ'ল আপনি "টা গ্যাম" এর মতো সাবস্ট্রিংগুলি অনুসন্ধান করতে পারবেন না। অবশ্যই আপনি শব্দের পরিবর্তে অক্ষর দ্বারা বিভক্ত হয়ে এর জন্য অনুমতি দিতে পারেন, তবে তারপরে আপনাকে প্রায়শই একটি বিশাল সেট তৈরি করতে হবে এবং সময় / মেমরিটি ব্যয় করার চেয়ে সুবিধাগুলি ছাড়িয়ে যায়।


1

সম্পূর্ণ সহায়তার জন্য (অতিরিক্তভাবে @ricca এর ভার্শনগুলি )

wordsArray = ['hello', 'to', 'nice', 'day']
yourString = 'Hello. Today is a nice day'.toLowerCase()
result = wordsArray.every(w => yourString.includes(w))
console.log('result:', result)


0

আপনি এটি চেক করতে পারেন:

<!DOCTYPE html>
<html>
   <head>
      <script src="https://ajax.googleapis.com/ajax/libs/jquery/3.4.1/jquery.min.js"></script>
      <script>
         $(document).ready(function(){
         var list = ["bad", "words", "include"] 
         var sentence = $("#comments_text").val()

         $.each(list, function( index, value ) {
           if (sentence.indexOf(value) > -1) {
                console.log(value)
            }
         });
         });
      </script>
   </head>
   <body>
      <input id="comments_text" value="This is a bad, with include test"> 
   </body>
</html>

-1
let obj = [{name : 'amit'},{name : 'arti'},{name : 'sumit'}];
let input = 'it';

ফিল্টার ব্যবহার করুন:

obj.filter((n)=> n.name.trim().toLowerCase().includes(input.trim().toLowerCase()))

দয়া করে ভিজিট করুন এবং কোনও প্রশ্নের উত্তর কীভাবে তা পরীক্ষা করে দেখুন ।
ইউনুস টেমুরলেঙ্ক

@YunusTemurlenk thnx
ArtiSK
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.