बहुत सीधा। जावास्क्रिप्ट में, मुझे यह जांचने की आवश्यकता है कि क्या किसी स्ट्रिंग में किसी सरणी में आयोजित कोई सबस्ट्रिंग है।
map
जितना नहीं some
। some
मदद करेगा, लेकिन आपको इसे एक फ़ंक्शन पास करना होगा।
बहुत सीधा। जावास्क्रिप्ट में, मुझे यह जांचने की आवश्यकता है कि क्या किसी स्ट्रिंग में किसी सरणी में आयोजित कोई सबस्ट्रिंग है।
map
जितना नहीं some
। some
मदद करेगा, लेकिन आपको इसे एक फ़ंक्शन पास करना होगा।
जवाबों:
इसमें कुछ भी अंतर्निहित नहीं है जो आपके लिए ऐसा करेगा, आपको इसके लिए एक फ़ंक्शन लिखना होगा।
यदि आप जानते हैं कि स्ट्रिंग्स में कोई भी ऐसा अक्षर नहीं है जो नियमित अभिव्यक्तियों में विशेष हो, तो आप इस तरह से थोड़ा धोखा दे सकते हैं:
if (new RegExp(substrings.join("|")).test(string)) {
// At least one match
}
... जो एक नियमित अभिव्यक्ति बनाता है जो आपके द्वारा खोजे जाने वाले सबस्ट्रिंग्स के लिए विकल्पों की एक श्रृंखला है (उदाहरण के लिए one|two
) और यह देखने के लिए परीक्षण करता है कि उनमें से किसी के लिए मैच हैं, लेकिन यदि किसी भी सब्सट्रेट में कोई भी वर्ण हैं जो विशेष हैं regexes ( *
और [
, आदि) में, आपको पहले उनसे बचना होगा और आप इसके बजाय सिर्फ बोरिंग लूप से बेहतर कर सकते हैं।
लाइव उदाहरण:
सवाल पर एक टिप्पणी में, मार्टिन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
}
लाइव उदाहरण:
new RegExp(substrings.join("|").replace(/[^\w\s^|]/gi, '')).test(string)
।
('disconnect'.indexOf('connect') >= 0) === true
लेकिन('disconnect' === 'conenct') === false
'disconnect' === 'connect'
कुछ भी लेकिन हो जाएगा false
। इसके अलावा, indexOf
फजी नहीं है, यह वास्तव में बहुत स्पष्ट रूप से परिभाषित है।
indexOf
दोनों से मेल खाएगा disconnect
और connect
जहां एक मामले में मैंने अनुभव किया है, ये दो अलग-अलग मामले हैं जो मैं एक सशर्त के लिए परिणाम वापस करना चाहता हूं।
एक लाइन समाधान
substringsArray.some(substring=>yourBigString.includes(substring))
true\false
यदि विकल्प हो तो लौटाता हैexists\does'nt exist
ES6 समर्थन की आवश्यकता है
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);
Googling के लोगों के लिए,
ठोस जवाब होना चाहिए।
const substrings = ['connect', 'ready'];
const str = 'disconnect';
if (substrings.some(v => str === v)) {
// Will only return when the `str` is included in the `substrings`
}
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
।
यदि सरणी बड़ी नहीं है, तो आप बस लूप कर सकते हैं और प्रत्येक प्रतिस्थापन के खिलाफ स्ट्रिंग की जांच कर सकते हैं indexOf()
। वैकल्पिक रूप से आप विकल्प के रूप में सब्सट्रिंग्स के साथ एक नियमित अभिव्यक्ति का निर्माण कर सकते हैं, जो अधिक कुशल हो सकता है या नहीं।
जावास्क्रिप्ट फ़ंक्शन खोज स्ट्रिंग या खोज स्ट्रिंग के एक सरणी का उपयोग करके टैग या कीवर्ड की एक सरणी की खोज करने के लिए कार्य करता है। ( 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
}
ऐसा नहीं है कि मैं सुझाव दे रहा हूं कि आप जाएं और String
प्रोटोटाइप को बढ़ाएं / संशोधित करें , लेकिन यही मैंने किया है:
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
सबसे अच्छा जवाब यहाँ है: यह मामला असंवेदनशील होने के साथ-साथ है
var specsFilter = [.....];
var yourString = "......";
//if found a match
if (specsFilter.some((element) => { return new RegExp(element, "ig").test(yourString) })) {
// do something
}
अंडरस्कोर.जेएस या लॉश.जेएस का उपयोग करके, आप स्ट्रिंग्स की एक सरणी पर निम्न कार्य कर सकते हैं:
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
यह सुपर लेट है, लेकिन मैं इस समस्या में भाग गया। अपने स्वयं के प्रोजेक्ट में मैंने यह जांचने के लिए निम्नलिखित का उपयोग किया कि क्या एक स्ट्रिंग एक सरणी में थी:
["a","b"].includes('a') // true
["a","b"].includes('b') // true
["a","b"].includes('c') // false
इस तरह आप एक पूर्वनिर्धारित सारणी ले सकते हैं और जाँच सकते हैं कि उसमें कोई तार है या नहीं:
var parameters = ['a','b']
parameters.includes('a') // true
टीजे क्राउडर के जवाब पर निर्माण
"कम से कम एक बार" घटना के लिए परीक्षण करने के लिए बच निकले RegExp का उपयोग करते हुए, कम से कम सबस्ट्रिंग में से एक।
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 ...'));
यदि आप रिक्त स्थान या किसी अन्य सामान्य चरित्र द्वारा अलग किए गए "पूर्ण" शब्दों से मिलकर सबस्ट्रिंग की एक लंबी सूची के साथ काम कर रहे हैं, तो आप अपनी खोज में थोड़ा चतुर हो सकते हैं।
पहले अपनी स्ट्रिंग को X के समूहों में विभाजित करें, फिर X + 1, फिर X + 2, ..., Y. X और Y तक क्रमशः आपके सबसे कम और सबसे अधिक शब्दों के स्थान पर आपके शब्दों की संख्या होनी चाहिए। उदाहरण के लिए यदि X 1 है और Y 4 है, तो "अल्फा बीटा गामा डेल्टा" बन जाता है:
"अल्फा" "बीटा" "गामा" "डेल्टा"
"अल्फा बीटा" "बीटा गामा" "गामा डेल्टा"
"अल्फा बीटा गामा" "बीटा गामा डेल्टा"
"अल्फा बीटा गामा डेल्टा"
यदि X 2 होगा और Y 3 होगा, तो आप पहली और अंतिम पंक्ति छोड़ देंगे।
अब आप इस सूची पर जल्दी से खोज कर सकते हैं यदि आप इसे एक सेट (या मैप) में सम्मिलित करते हैं, तो स्ट्रिंग तुलना की तुलना में बहुत तेज।
नकारात्मक पक्ष यह है कि आप "ता गाम" जैसे सबस्ट्रिंग की खोज नहीं कर सकते हैं। बेशक आप इसके लिए शब्द के बजाय चरित्र से विभाजित करके अनुमति दे सकते हैं, लेकिन फिर आपको अक्सर एक बड़े पैमाने पर सेट बनाने की आवश्यकता होगी और ऐसा करने में लगने वाले समय / स्मृति को लाभ मिलेगा।
पूर्ण समर्थन के लिए (@ricca के verions के अतिरिक्त )।
wordsArray = ['hello', 'to', 'nice', 'day']
yourString = 'Hello. Today is a nice day'.toLowerCase()
result = wordsArray.every(w => yourString.includes(w))
console.log('result:', result)
आप इस तरह की जाँच कर सकते हैं:
<!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>
let obj = [{name : 'amit'},{name : 'arti'},{name : 'sumit'}];
let input = 'it';
फ़िल्टर का उपयोग करें:
obj.filter((n)=> n.name.trim().toLowerCase().includes(input.trim().toLowerCase()))
map()
नए HTML5-JavaScript-संस्करण में कोई फ़ंक्शन नहीं है ? मुझे याद है कि उस विषय पर कुछ पढ़ा ...