2016-02-24 36 views
5

की सरणी से सबस्ट्रिंग खोजने के लिए लॉलाश का उपयोग करें, मैं लॉनाश सीख रहा हूं। तारों की सरणी में एक सबस्ट्रिंग खोजने के लिए lodash का उपयोग करना संभव है?स्ट्रिंग्स

var myArray = [ 
    'I like oranges and apples', 
    'I hate banana and grapes', 
    'I find mango ok', 
    'another array item about fruit' 
    ] 

क्या यह पुष्टि करना संभव है कि 'संतरे' शब्द मेरी सरणी में है या नहीं? मैं कोशिश की है _.includes, _.some, _.indexOf लेकिन वे सभी के रूप में वे संपूर्ण स्ट्रिंग, सबस्ट्रिंग नहीं देखो यह करने के लिए

+0

क्या आप सरणी में स्ट्रिंग में शामिल हो सकते हैं और indexOf का उपयोग कर सकते हैं? – James

उत्तर

12

आप आसानी से lodash के उच्च क्रम कार्यों का उपयोग कर some() के लिए एक iteratee निर्माण कर सकते हैं। उदाहरण के लिए:

_.some(myArray, _.unary(_.partialRight(_.includes, 'orange'))); 

unary() समारोह सुनिश्चित करता है कि केवल एक ही तर्क कॉलबैक करने के लिए पारित कर दिया है। partialRight() फ़ंक्शन का उपयोग 'orange' मान को includes() पर दूसरे तर्क के रूप में लागू करने के लिए किया जाता है। पहला तर्क some() के प्रत्येक पुनरावृत्ति के साथ प्रदान किया जाता है।

हालांकि, यदि मामला संवेदनशीलता मायने रखती है तो यह दृष्टिकोण काम नहीं करेगा। उदाहरण के लिए, 'Orange' झूठी वापसी करेगा। आप निम्न तरीके से मामले की संवेदनशीलता को संभाल कर सकते हैं:

_.some(myArray, _.method('match', /Orange/i)); 

method() समारोह एक समारोह है कि पहला तर्क यह करने के लिए पारित कर दिया की दी गई विधि कॉल करेंगे बनाता है। यहां, हम एक केस-असंवेदनशील नियमित अभिव्यक्ति के खिलाफ मेल खाते हैं।

या, यदि मामले संवेदनशीलता कोई फर्क नहीं पड़ता और आप बस method() प्रक्रिया अपनाते हैं, यह रूप में अच्छी तरह ES2015 के लिए काम करता है:

_.some(myArray, _.method('includes', 'orange')); 
+1

सीखने की कोशिश कर रहा हूं, कई कार्यों के महान स्पष्टीकरण, धन्यवाद। मैं इन उदाहरणों को अलेक्जेंडर यत्केविच के _.curry के सहायक कार्यान्वयन पर पसंद करता हूं, क्योंकि _.method को एक अलग कस्टम फ़ंक्शन के निर्माण की आवश्यकता नहीं होती है। –

+0

मैंने केस असंवेदनशील उदाहरण के साथ एक छोटी सी क्वेरी देखी है। यदि 'ऑरेंज' शब्द एक चर था (यह कोई शब्द हो सकता है), तो क्या हमें इसे पार करने से पहले इसे बचाना होगा? यानी ऐसा कुछ (परीक्षण नहीं किया गया) 'var myWord = 'ऑरेंज'; _।कुछ (myArray, _.method ('मैच', नया RegExp (_। escapeRegExp (myWord), "i"))); ' –

3

दो त्वरित तरीके विफल - न lodash (खेद) का उपयोग करता

var found = myArray.filter(function(el){ 
    return el.indexOf('oranges') > -1; 
}).length; 

if (found) { // oranges was found } 

या मैं टिप्पणी में उल्लेख किया है के रूप में:

var found = myArray.join(',').indexOf('oranges') > -1; 
if (found) { // oranges was found } 
+0

धन्यवाद जेम्स। ये बहुत अच्छा काम करता है। यदि कोई भी लॉनाश तरीके को स्पष्ट नहीं करता है तो मैं आपके उत्तर को सही के रूप में चिह्नित करूंगा। –

+0

अधिकांश मामलों के लिए अंतिम विधि बहुत अच्छी है, और यह पुराने ब्राउज़र में भी काम करती है। 'फ़िल्टर' या 'कुछ' की कोई ज़रूरत नहीं है। – AsGoodAsItGets

0

आप इस lodash उपयोग कर सकते हैं, लेकिन यह भी देशी जावास्क्रिप्ट तरीकों का उपयोग कर बहुत मुमकिन है:

function stringArrayContains(array, str) { 
    function contains(el) { 
    return (el.indexOf(str) !== -1) ? true : false; 
    } 

    return array.some(contains); 
} 

ऊपर समारोह का परीक्षण:

var a = ['hello', 'there']; 
var b = ['see', 'ya', 'later']; 

stringArrayContains(a, 'ell') // true 
stringArrayContains(a, 'what') // false 
stringArrayContains(b, 'later') // true 
stringArrayContains(b, 'hello') // false 

Array.prototype.some एक समारोह आप एक सरणी के प्रत्येक तत्व को परिभाषित लागू होता है। इस फ़ंक्शन (नामक हमारे मामले में शामिल हैं) को सत्य या गलत वापस करना होगा। सरणी तत्वों के माध्यम से पुनरावृत्ति करते समय, यदि कोई तत्व सत्य देता है, तो कुछ विधि सत्य लौटती है।

व्यक्तिगत रूप से, मुझे सामान्य रूप से लगता है कि यदि आप सरल कार्यों के लिए मूल जेएस विधियों का उपयोग कर सकते हैं, तो बस एक ही चीज़ करने के लिए लाइब्रेरी लोड करना बेहतर है। लोडाश में बिल्कुल प्रदर्शन लाभ होते हैं, लेकिन जब तक आप बड़ी मात्रा में डेटा संसाधित नहीं कर लेते हैं, तब तक उन्हें जरूरी नहीं माना जाता है। केवल मेरे दो सेंट्स।

चीयर्स!

0

एक सबस्ट्रिंग को शामिल करने के लिए फ़ंक्शन को परिभाषित करने का सबसे अच्छा तरीका है।

var contains = _.curry(function (substring, source) { 
    return source.indexOf(substring) !== -1; 
}); 

मैं _.curry यहाँ का प्रयोग कर एक curried समारोह, जो आंशिक रूप से तो लागू किया जा सकता प्राप्त करने के लिए।

_.some(myArray, contains('item')); 

आप एक जुड़ी स्ट्रिंग में एक सबस्ट्रिंग भी पा सकते हैं।

contains('item', _.join(myArray)) 

युपीडी:

मैं नहीं दिखाई दी lodash पहले से ही एक संग्रह में मूल्य खोजने के लिए एक समारोह है।

फ़ंक्शन _.includes जो मैंने ऊपर परिभाषित किया है, वही है। हालांकि, लॉनाश में सबकुछ के रूप में, यह तर्कों के लिए अलग-अलग क्रम का उपयोग करता है। मेरे उदाहरण में, मैंने एक स्रोत को एक करीबी फ़ंक्शन के लिए नवीनतम तर्क के रूप में रखा है जो मेरे फ़ंक्शन को पॉइंट-फ्री स्टाइल प्रोग्रामिंग के लिए उपयोगी बनाता है जब लॉकैश उसी फ़ंक्शन के पहले तर्क के रूप में स्रोत के लिए प्रतीक्षा करता है।

चेक इस मामले https://www.youtube.com/watch?v=m3svKOdZijA

पर ब्रायन Lonsdorf की बात भी ramda पर गौर करने का मौका ले लो।यह पुस्तकालय जावास्क्रिप्ट में व्यावहारिक कार्यात्मक प्रोग्रामिंग के लिए एक बेहतर तरीका प्रदान करता है।

+1

_.curry का उपयोग कर तकनीक के लिए धन्यवाद, क्योंकि मैं 'लॉनाश दृष्टिकोण' –

-1
let str1 = 'la rivière et le lapin sont dans le près'; 
let str2 = 'product of cooking class'; 
let str3 = 'another sentence to /^[analyse]/i with weird!$" [email protected]'; 

_.some(_.map(['rabbit','champs'], w => str1.includes(w)), Boolean), // false 
_.some(_.map(['cook'],   w => str2.includes(w)), Boolean), // true 
_.some(_.map(['analyse'],   w => str3.includes(w)), Boolean), // true 
0

मैं की कोशिश करते हुए इस प्रश्न/उत्तर धागा में भाग कैसे एक एरे में प्रत्येक स्ट्रिंग के खिलाफ एक सबस्ट्रिंग से मेल खाता है और किसी भी सरणी आइटम को हटा दें जिसमें उस सबस्ट्रिंग शामिल हैं।

जबकि उपरोक्त उत्तरों ने मुझे ट्रैक पर रखा है, और जबकि यह विशेष रूप से मूल प्रश्न का उत्तर नहीं देता है, यह थ्रेड Google खोज में पहले दिखाई देता है जब आप यह पता लगाने की कोशिश कर रहे हैं कि उपरोक्त उपरोक्त निष्कासन को कैसे पूरा किया जाए वस्तु इसलिए मैंने सोचा कि मैं यहां एक उत्तर पोस्ट करूंगा।

 // The String (SubString) we want to match against array (for dropping purposes) 
     var searchSubString = "whatever" 

     // Remove all array items that contain the text "whatever" 
     _.remove(my_array, function(searchSubString) { 
       return n.indexOf(searchSubString) !== -1; 
      }); 

मूल रूप से indexOf, स्ट्रिंग के भीतर-स्ट्रिंग की स्थिति के खिलाफ मिलान किया जाता है यदि सबस्ट्रिंग है:

मैं Lodash के _.remove समारोह का उपयोग करने के सरणी तार मिलान इस प्रकार दूर करने के लिए एक तरह से लग रहा समाप्त हो गया नहीं मिला यह 1 वापस आ जाएगा, जब indexOf -1 से दूसरे नंबर पर लौटाता है (संख्या ऐरे स्ट्रिंग के भीतर वर्णों की संख्या में सबस्ट्रिंग स्थिति है)।

लोडाश सरणी वस्तु को सरणी उत्परिवर्तन के माध्यम से हटा देता है और नए संशोधित सरणी को उसी नाम से एक्सेस किया जा सकता है।