2015-09-18 4 views
13

मैं एक ऐसे सरणी में सभी तत्वों को फ़िल्टर करने की कोशिश कर रहा हूं जो 10 से अधिक नई सरणी में हैं। मैं जानबूझकर Array.prototype.filter() का उपयोग नहीं कर रहा हूं क्योंकि मैं reduce() विधि सीखना चाहता हूं। यहाँ कोड मैंक्यों Array.prototype.reduce() accumulator के रूप में एक खाली सरणी नहीं ले रहा है?

var collection = [3, 5, 11, 23, 1]; 
 

 
// fileter all the elements bigger than 10 to a new array 
 

 
var output = collection.reduce(function(filteredArr, collectionElemet) { 
 
    if (collectionElemet > 10) { 
 
    return filteredArr.push(collectionElemet); 
 
    } 
 
}, []);

मैं उम्मीद कर रहा था कि filteredArr पहले कॉलबैक निष्पादन के समय एक खाली सरणी के साथ प्रारंभ किया जाएगा क्योंकि यह कई here दिए गए उदाहरणों के साथ होता है के साथ खेल रहा था है। लेकिन जब मैं इस कोड को चलाने के लिए, मैं त्रुटि Cannot read property 'push' of undefined, जहां मैं इसे खिलवाड़ कर रहा हूँ मिल सकता है? धन्यवाद!

+0

अगर हालत सही है - आप एक 'undefined' वापसी - आप एक नंबर सही नहीं है, तो लौटने के लिए,। यदि आप बस फ़िल्टर करना चाहते हैं - 'Array.prototype.filter' का उपयोग करें, तो आपका वर्तमान कोड बदसूरत और भ्रामक है। – zerkms

+0

@zerkms: यह उत्पादन कोड के लिए उचित है, न कि शिक्षा/प्रयोग के लिए। ओपी स्पष्ट रूप से कहता है कि वह 'फ़िल्टर' के बारे में जानता है, लेकिन' कम करने 'को समझने की कोशिश कर रहा है। – Amadan

+1

@ अमानन तो यह एक कमजोर प्रयास है: उनको उपयोग किए जाने वाले उपयोगकाजों का उपयोग करके कार्यों को समझने का प्रयास करना समझ में आता है। – zerkms

उत्तर

26

आप, इतना है कि यह अगली कॉल

var collection = [3, 5, 11, 23, 1]; 

// filter all the elements bigger than 10 to a new array 

var output = collection.reduce(function(filteredArr, collectionElement) { 
    if (collectionElement > 10) { 
    filteredArr.push(collectionElement); 
    } 
    return filteredArr; 
}, []); 
4

Array.prototype.push के लिए previousValue के रूप में प्रयोग किया जाता है नई सरणी की लंबाई वापस आ जाएगी आपकी अनाम समारोह से filteredArr लौटना ही होगा। आपको जमाकर्ता वापस करने की जरूरत है। ऐसा करने का एक संक्षिप्त तरीके से, Array.prototype.concat साथ है के बाद से उस विधि वास्तव में सरणी वापस आ जाएगी:

var collection = [3, 5, 11, 23, 1]; 

var output = collection.reduce(function(filteredArr, collectionElemet) { 
    if (collectionElemet > 10) { 
    return filteredArr.concat(collectionElemet); 
    } 
}, []); 

आप संचायक वापस जाने के लिए तो अगले चरण संचायक के मूल्य का उपयोग कर सकते हैं।

+0

मेरा डाउनवोट नहीं है, लेकिन * कॉन्सट * हर बार एक नई सरणी देता है, जो अक्षम है। * पुश * मौजूदा तत्वों में नए तत्वों को जोड़ने के लिए स्पष्ट विकल्प है। – RobG

+1

हमेशा दक्षता के बारे में नहीं है, वैध जवाब है क्योंकि दो चीजों को चित्रित करना, एक पंक्ति में समाधान कैसे बनाना है और @segmentationfaulter को फ़िल्टर किया जाना चाहिए। उनका भ्रम शायद सोच रहा था कि filteredArr.push filteredArr वापस आ जाएगा। – titusfx

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