2015-02-12 10 views
18

सी # में, हमारे पास Enumerable.First(predicate) है। इस जावा स्क्रिप्ट कोड को देखते हुए:जावास्क्रिप्ट फ़िल्टर पहले LINQ के Enumberable के बराबर है। सबसे पहले (predicate)

function process() { 
    var firstMatch = ['a', 'b', 'c'].filter(function(e) { 
    return applyConditions(e); 
    }).shift(); 

    if(!firstMatch) { 
    return; 
    } 

    // do something else 
} 

function applyConditions(element) { 
    var min = 97; 
    var max = 122; 

    var random = Math.floor(Math.random() * (max - min + 1) + min); 

    return element === String.fromCharCode(random); 
} 

forEach के अलावा अन्य,, पाश का उपयोग कर कई या ऑपरेटर का उपयोग करके या परोक्ष some(predicate) बुला, वहाँ firstMatch पाने की एक समझदारी भरा तरीका है? अधिमानतः एक जावास्क्रिप्ट फ़ंक्शन (filterFirst(pedicate) जैसे कुछ) जो पहले मैच पर शॉर्ट-सर्किट सी # के Enumerable.First() कार्यान्वयन जैसा दिखता है?

FWIW, मैं node.js/io.js रनटाइम को लक्षित कर रहा हूं।

उत्तर

30

पहिया, यह .find उपयोग करने के लिए है करने के लिए सही तरीका बदलने की कोई जरूरत नहीं:

var firstMatch = ['a', 'b', 'c'].find(applyConditions); 

आप एक ब्राउज़र का उपयोग कर रहे हैं .find आप कर सकते हैं polyfill it

+0

+1 हां '। ढूँढें (predicate)' ठीक है जो मैं node.js. में देख रहा हूँ यह अभी भी प्रयोगात्मक है और विनिर्देश स्थिति मसौदा है। –

+1

यह निष्पक्ष होने के लिए _really_ प्रयोगात्मक नहीं है :) मसौदा बस गया है, वे अब अन्य सामानों के अर्थशास्त्र को समझ रहे हैं। –

2

आप इस मामले में अनुकरण कर सकते हैं जहां आप पहले सच्चाईreduce के साथ मूल्य वापस करना चाहते हैं।

['a', 'b', 'c'].reduce(function(prev, curr) { 
    return prev || predicate(curr) && curr; 
}, false); 

संपादित करें: @BenjaminGruenbaum सुझाव

+0

डैंडी का समर्थन नहीं करता है! 'कमी() 'अपवाद के साथ बहुत करीब है कि यह सरणी के प्रत्येक तत्व के लिए कॉलबैक का आह्वान करता है (जैसा कि पहले मैच पर शॉर्ट-सर्किट के विपरीत है)। –

+0

@ वल्कनरावेन मुझे नहीं लगता कि यह करता है - यह वास्तव में पालन करने में उलझन में है - इसे 'रिटर्न prev || के रूप में लिखा जा सकता है || predicate (curr) && curr' - यह भी गलत सरणी तत्वों के लिए असफल हो जाएगा (उदाहरण के लिए 0 खोज रहा है)। –

+0

@ बेंजामिनग्रेनबाम कम पूर्ण सरणी के लिए कॉलबैक को हमेशा कम करता है, यह शॉर्ट सर्किट – Esailija

1

क्षमा के साथ और अधिक संक्षिप्त कर दिया लेकिन इस नरक

function first(array, predicate) { 
    for (var i = 0; i < array.length; ++i) { 
     if (predicate(array[i])) return array[i]; 
    } 
    throw new Error("no match"); 
} 

यह अपनी खुद की कपोल-कल्पना लोगों को बनाने के लिए ठीक है के रूप में तुच्छ है।

+2

यह लिखना भी धीमा है, अधिक त्रुटि प्रवण, पढ़ने के लिए कठिन है, और बदसूरत –

+1

जैसा आपने सोचा उतना छोटा नहीं है। यदि भविष्यवाणी शून्य या अनिर्धारित है तो आपका तत्व पहले तत्व को वापस करने की बजाय विफल रहता है। मैं [1, 2] नहीं कर सकता। सबसे पहले(), तो यह LINQ के बराबर सटीक नहीं है। और यही कारण है कि जब यह पहले से मौजूद है तो abstractions बनाना ठीक नहीं है। – Atomosk

संबंधित मुद्दे