2014-09-24 4 views
17

अंडरस्कोर.जेएस संग्रह पर _.each और _.map प्रदान करता है, जो अच्छा है, लेकिन मुझे अपने ऑब्जेक्ट के सभी विशेषताओं पर पुनरावृत्ति करने की आवश्यकता है। मुझे मूल्यों को संशोधित करने और कुंजी को संरक्षित करने की आवश्यकता है। जैसे मेरे पास कुछ ऐसा है: {a:1, b:2, c:3} और मुझे एक ऐसा ऑपरेशन करने की ज़रूरत है जो मान को बदलती है लेकिन चाबियाँ रखती है। मान लें, मैं वर्गों की गणना करूंगा, मुझे {a:1, b:4, c:9} मिलना चाहिए। सवाल यह है: अंडरस्कोर (वेनिला जावास्क्रिप्ट में रूचि नहीं) का उपयोग करके ऐसा कैसे करें? मैं की तरह एक विधि में खुशी होगी: इसके अतिरिक्तऑब्जेक्ट विशेषताओं पर Iterate और उन्हें संशोधित करें

var a = {a:1, b:2, c:3} 
_.magic(a, function(item){ return item*item; }); 

, यह बहुत अच्छा है कि अगर यह यह श्रृंखला संभव था हो सकता है, के बाद से मैं एक नक्शा कर रहा हूँ, डंप परिणाम प्रत्येक प्रदर्शन करने के लिए और फिर एक नक्शा फिर से उपयोग (क्योंकि मुझे निम्न की जरूरत है)।

उत्तर

14

मैं अगर वहाँ मूल वस्तु उत्परिवर्तित करने के लिए एक विकल्प था देखने के लिए मेरी के टुकड़े में से कुछ में थोड़ा और अधिक देखा है, लेकिन मैं कुछ भी रुचिकर नहीं था, इसलिए मैं this साथ जाना चाहते हैं: \

var original = {a:1, b:2, c:3}; 
var squaredValues = _.object(_.map(original, function (value, key) { 
    return [key, value * value]; 
})); 

मुझे उम्मीद है कि हालांकि एक और अधिक सुरुचिपूर्ण समाधान है।

1

जेवियर 9 2 के लिए बड़ा धन्यवाद जिन्होंने मुझे सही समाधान की ओर इशारा किया।

वैसे भी, मैं एक और दो अंडरस्कोर तरीकों का उपयोग करता है एक अंडरस्कोर विधि का उपयोग करना पसंद नहीं है (यह बहुत जो पढ़ने योग्य नहीं है), तो मैं एक सरल आवरण समारोह है कि अंडरस्कोर में में मिलाया जाता है के साथ आया था:

// mixin to make our new function available via _ 
_.mixin({ 
    updateAttributes: function(object, iteratee) { 
     return _.object(_.map(object, function (value, key) { 
      return [key, iteratee(value)]; 
     })); 
    } 
}); 

अपने कोड में कहीं न कहीं इसका इस्तेमाल:

_.updateAttributes({a:1, b:2, c:3}, function(item){ return item*item; }) 
// Object {a: 1, b: 4, c: 9} 

एक शब्द समारोह के बारे में सोच नहीं सकता था (शायद वहाँ updateAttributes से कुछ बेहतर है)।

+6

लो-डैश इसे [_.mapValues] है (http : //lodash.com/docs#mapValues) –

33

_.mapObject (added in version 1.8) वही है जो आप खोज रहे हैं।


पिछले संस्करणों के लिए, _.each कॉलबैक करने के लिए तीसरा तर्क का उपयोग कर मूल वस्तु उत्परिवर्तित कर सकते हैं।

_.each({a:1, b:2, c:3}, function(value, key, obj) { obj[key] = value * value; }); 

एक प्रारंभिक ज्ञापन के साथ _.reduce का उपयोग के साथ-साथ एक नया वस्तु बना सकते हैं।

_.reduce({a:1, b:2, c:3}, function(memo, value, key) { 
    memo[key] = value * value; 
    return memo; 
}, {}); 

मैं _.reduce दृष्टिकोण पसंद करूंगा। एक साधारण मिश्रण इसे _.map की तरह व्यवहार करेगा।

_.mixin({ 
    magic: function(obj, iterator, context) { 
     return _.reduce(obj, function(memo, value, key) { 
      memo[key] = iterator.call(context, value, key, obj); 
      return memo; 
     }, {}); 
    } 
}); 
3

जस्टिन के रूप में कहा _.mapObject हो सकता है आप के लिए क्या देख रहे थे। लेकिन यह एक नई वस्तु बनाता है ({} बढ़ा रहा है) जो शायद आप नहीं चाहते हैं (उदाहरण के लिए यदि यह new THREE.Vector3() जैसी साधारण वस्तु नहीं है), तो मूल ऑब्जेक्ट को कुछ अलग से बदलने के लिए कोई अच्छा नहीं है।

उस मामले ( में जगह में मूल्यों को संशोधित करने दिया वस्तु) सिर्फ अपने iteratee समारोह के तीसरे पैरामीटर के साथ _.each उपयोग करें:

_.each(complexObject, function(value, key, obj) { 
    obj[key] = value * value; 
}); 
संबंधित मुद्दे