2013-02-27 108 views
8

के साथ दो में दो (या अधिक) सरणी मैपिंग मुझे तत्व-वार कई सरणी जोड़ने की आवश्यकता होगी। यही है, मेरे पास बराबर लंबाई के कई सरणी हैं, और मुझे केवल उसी तत्व की आवश्यकता होगी जो इनपुट के योग हैं। अंडरस्कोर में सभी तत्वों को एक में फोल्ड करने और फ़ंक्शन का उपयोग करके प्रत्येक तत्व को मैप करने के तरीके हैं, लेकिन मुझे दो सरणी को टुकड़े टुकड़े करने के लिए कोई रास्ता नहीं मिल रहा है।underscore.js

यदि मेरे मूल सरणी [1,2,3,4,5,6], [1,1,1,1,1,1] और [2,2,2,2,2,2] परिणाम [4,5,6,7,8,9] होना चाहिए।

मुझे पता है कि मैं इसे सरणी पर फिर से चलाकर कर सकता हूं, लेकिन आश्चर्य है कि यह underscore.js फ़ंक्शंस का उपयोग करके आसान/तेज़ होगा। क्या इसे मै कर सकता हूँ? कैसे?

उत्तर

10

आसान हाँ, तेज़ संख्या।

var arrays = [[1,2,3,4,5,6], [1,1,1,1,1,1], [2,2,2,2,2,2]]; 

_.map(_.zip.apply(_, arrays), function(pieces) { 
    return _.reduce(pieces, function(m, p) {return m+p;}, 0); 
}); 
+0

यह सही है। यह मेरे सभी परिदृश्यों में काम करता है और पर्याप्त तेज़ है। मैं प्रत्यक्ष पुनरावृत्ति के खिलाफ इसे बेंचमार्क करने जा रहा हूं, लेकिन बहुत अच्छा लग रहा है। धन्यवाद। –

+0

@ बर्गि मैं 'लागू नहीं करता हूं' _ लागू करें, _ नोटेशन। क्या अंडरस्कोर फ़ंक्शन यह _ से संबंधित है? –

+0

@StephaneRolland: '_' यहां अंडरस्कोर ऑब्जेक्ट है। जांचें [' fn.apply'] (https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Function/apply) तर्कों के साथ करता है ... वास्तव में हम यहां 'शून्य' भी पारित कर सकते थे। – Bergi

5

मुझे नहीं लगता कि यह अंडरस्कोर के साथ आसान होगा। यहां दो विकल्प हैं:

var a = [1,2,3,4,5,6] 
    , b = [1,1,1,1,1,1] 
    , c = [2,2,2,2,2,2]; 

var result = a.map(function(_,i) { 
    return a[i] + b[i] + c[i]; 
}); 

// OR 

var result = []; 
for (var i = 0; i < a.length; i++) { 
    result.push(a[i] + b[i] + c[i]); 
} 

console.log(result); //=> [4,5,6,7,8,9] 
+1

दूसरा संस्करण वह है जो मैं अभी उपयोग कर रहा हूं। केवल समस्या यह है कि, जबकि यह दो या तीन सरणी के लिए ठीक काम करता है, यह कुछ और होने पर अवधारणात्मक रूप से सीमित होता है। मेरा मूल विचार था कि सरणी की एक सरणी बनाना और-साथ-साथ उन्हें सभी तत्व-वार मैप करना था। वैसे भी, आपका पहला समाधान वादा करता है। मैं इसे विस्तारित करने की कोशिश करने जा रहा हूं। –

0

आप नक्शे के साथ संयोजन के रूप में जिप का उपयोग करें और कम कर सकते हैं: जांची नहीं लेकिन कुछ इस तरह

var result = _.map(_.zip(array1, array2, array3),function(zipped){return _.reduce(zipped, function(memo, num){ return memo + num; }, 0)}); 
+0

एक है पहले अंडरस्कोर के बाद गायब डॉट :)। आपका समाधान लगभग उसी बर्गी लिखा है, लेकिन ज़िप बनाम का उपयोग कर रहा है। zip._apply मुझे सही जवाब नहीं देता है। मुझे यह जानने के लिए प्रलेखन पर वापस जाने की आवश्यकता क्यों है। बहुत बहुत धन्यवाद। –

+0

मैं इसे सही करता हूं। – benzonico

3

काम हो सकता है एक zipWith का अनुकरण करने के लिए, आप एक sum- reduce के साथ एक zip गठजोड़ कर सकते हैं आप अंडरस्कोर के बजाय लॉनाश (https://lodash.com/) का उपयोग कर सकते हैं जिसमें एक बहुत अच्छा ज़िप (https://lodash.com/docs#zipWith) ऑपरेटर है जो नीचे दिए गए उदाहरण की तरह काम करेगा। (नोट _.add भी एक लॉस मैथ फ़ंक्शन है)

var a = [1,2,3,4,5,6] 
    , b = [1,1,1,1,1,1] 
    , c = [2,2,2,2,2,2]; 

var result = _.zipWith(a, b, c, _.add); 

// result = [4, 5, 6, 7, 8, 9]