ऑब्जेक्ट प्रोटेक्टिंग कीज पर मैप


129

mapUnderscore.js में समारोह, एक जावास्क्रिप्ट वस्तु के साथ कहा जाता है, वस्तु के मूल्यों से मैप किया मूल्यों की एक सरणी देता है।

_.map({one: 1, two: 2, three: 3}, function(num, key){ return num * 3; });
=> [3, 6, 9]

क्या यह कुंजी को बनाए रखने का एक तरीका है? यानी, मैं ऐसा फंक्शन चाहता हूं जो वापस आए

{one: 3, two: 6, three: 9}

यदि आप, मेरी तरह, यहाँ एक 'मेपवैल्यूज़' जैसे फंक्शन की तलाश में आए थे, जो किसी नए को वापस करने के बजाय वास्तविक ऑब्जेक्ट को बदलता है, तो इस सरल समाधान को देखें: stackoverflow.com/questions/30894044/…
माइकल ट्राउट 69

जवाबों:


228

अंडरस्कोर के साथ

अंडरस्कोर _.mapObjectमानों को मैप करने और कुंजियों को संरक्षित करने के लिए एक फ़ंक्शन प्रदान करता है ।

_.mapObject({ one: 1, two: 2, three: 3 }, function (v) { return v * 3; });

// => { one: 3, two: 6, three: 9 }

DEMO


लोदाश के साथ

लोदाश _.mapValuesमानों को मैप करने और कुंजियों को संरक्षित करने के लिए एक फ़ंक्शन प्रदान करता है ।

_.mapValues({ one: 1, two: 2, three: 3 }, function (v) { return v * 3; });

// => { one: 3, two: 6, three: 9 }

DEMO


अंडरस्कोर में _.mapValues ​​फ़ंक्शन प्राप्त करने का प्रयास किया गया है: प्रासंगिक मुद्दा , _.mapValues ​​के लिए पुल अनुरोध । मुझे उम्मीद है कि यह :) के माध्यम से चला जाता है
राफोमेनिया

यह मुझे ऐसा लगता है जैसे आप किसी ऑब्जेक्ट में एक ऑब्जेक्ट बना रहे हैं, या मैं अपने दिमाग से बाहर हूं?
jsh

@jsh इस मामले में, _.map()वापस आ रहा है [['one', 3], ['two', 6], ['three', 9]], जो सरणियों की एक सरणी है, और _.object()इसे वापस एक वस्तु में बदल रहा है।
जेजेन थॉमस

56

मैं लॉकेट में आवश्यक फ़ंक्शन को खोजने में कामयाब रहा, जो अंडरस्कोर के समान एक उपयोगिता पुस्तकालय है।

http://lodash.com/docs#mapValues

_.mapValues(object, [callback=identity], [thisArg])

कॉलबैक के माध्यम से ऑब्जेक्ट की प्रत्येक स्वयं की असंख्य संपत्ति को चलाकर उत्पन्न की गई वस्तु और मूल्यों के समान कुंजी के साथ एक ऑब्जेक्ट बनाता है। कॉलबैक इस आर्ग के लिए बाध्य है और तीन तर्कों के साथ लागू किया गया है; (वैल्यू, की, ऑब्जेक्ट)।


19

var mapped = _.reduce({ one: 1, two: 2, three: 3 }, function(obj, val, key) {
    obj[key] = val*3;
    return obj;
}, {});

console.log(mapped);
<script src="http://underscorejs.org/underscore-min.js"></script>
<script src="https://getfirebug.com/firebug-lite-debug.js"></script>


13

मुझे पता है कि यह पुराना है, लेकिन अब अंडरस्कोर के पास वस्तुओं के लिए एक नया नक्शा है:

_.mapObject(object, iteratee, [context]) 

आप निश्चित रूप से सरणियों और वस्तुओं दोनों के लिए एक लचीला नक्शा बना सकते हैं

_.fmap = function(arrayOrObject, fn, context){
    if(this.isArray(arrayOrObject))
      return _.map(arrayOrObject, fn, context);
    else
      return _.mapObject(arrayOrObject, fn, context);
}

5
उपयोगकर्ताओं को दर्ज करने के लिए नोट करें: इस बदलाव पर जडल्टन ने अंडरस्कोर।जेएस के साथ संगतता को तोड़ने का फैसला किया है । लताश समर्थन नहीं करेगा mapObject; mapValuesइसके बजाय लॉश की विधि देखें।
मार्क एमी

13

सादे JS ( ES6 / ES2015 ) में इस संस्करण के बारे में कैसे ?

let newObj = Object.assign(...Object.keys(obj).map(k => ({[k]: obj[k] * 3})));

jsbin

यदि आप किसी ऑब्जेक्ट पर पुनरावर्ती रूप से मैप करना चाहते हैं (मैप नेस्टेड obj), तो इसे इस तरह किया जा सकता है:

const mapObjRecursive = (obj) => {
  Object.keys(obj).forEach(key => {
    if (typeof obj[key] === 'object') obj[key] = mapObjRecursive(obj[key]);
    else obj[key] = obj[key] * 3;
  });
  return obj;
};

jsbin

ES7 / ES2016 के बाद से आप इस तरह Object.entriesका उपयोग कर सकते हैं Object.keys:

let newObj = Object.assign(...Object.entries(obj).map([k, v] => ({[k]: v * 3})));

5

मुझे पता है कि यह एक लंबा समय रहा है, लेकिन अभी भी गुना (js में उर्फ ​​कम) के माध्यम से सबसे स्पष्ट समाधान गायब है, पूर्णता के लिए मैं इसे यहां छोड़ दूँगा:

function mapO(f, o) {
  return Object.keys(o).reduce((acc, key) => {
    acc[key] = f(o[key])
    return acc
  }, {})
}

मैं लोदाश पुस्तकालय के उपयोग के साथ ठीक हूं, लेकिन प्रोग्रामर इस तरह के पुस्तकालयों का उपयोग कर रहे हैं, और न जाने कैसे यह चीजें वेनिला जेएस में हासिल की जा सकती हैं। इसलिए, मैं आपके उत्तर की सराहना करता हूं!
सायोनर

3

_.मैप एक एरे लौटाता है, एक वस्तु नहीं।

यदि आप एक वस्तु चाहते हैं तो आप एक अलग फ़ंक्शन का उपयोग करके बेहतर हैं each; यदि आप वास्तव में मानचित्र का उपयोग करना चाहते हैं तो आप कुछ ऐसा कर सकते हैं:

Object.keys(object).map(function(value, index) {
   object[value] *= 3;
})

लेकिन यह भ्रामक है, जब किसी mapको परिणाम के रूप में एक सरणी होने की उम्मीद होती है और फिर उसके साथ कुछ बनाते हैं।


मुझे डॉक्स पढ़ने का अहसास था कि अंडरस्कोर.जेएस में यह कोशिश करना स्वाभाविक नहीं होगा। मुझे लगता है कि मेरा उपयोग मामला काफी स्वाभाविक है, वे इसका समर्थन क्यों नहीं करते?
xuanji

एक कारण यह हो सकता है कि mapआउटपुट के रूप में एक सरणी बनाने वाले इनपुट को बदलने के लिए उपयोग किया जाता है, आप कंपोज कर सकते हैं _.objectऔर _.map@GG के रूप में। लिखा है, लेकिन इस बिंदु पर स्वाद की बात है।
अल्बर्टो जक्काग्नि

3

मुझे लगता है कि आप एक MapValues फ़ंक्शन चाहते हैं (किसी ऑब्जेक्ट के मूल्यों पर एक फ़ंक्शन को मैप करने के लिए), जो अपने आप को लागू करने के लिए काफी आसान है:

mapValues = function(obj, f) {
  var k, result, v;
  result = {};
  for (k in obj) {
    v = obj[k];
    result[k] = f(v);
  }
  return result;
};


0

अंडरस्कोर मैप बग के लिए एक मिक्स फिक्स : पी

_.mixin({ 
    mapobj : function( obj, iteratee, context ) {
        if (obj == null) return [];
        iteratee = _.iteratee(iteratee, context);
        var keys = obj.length !== +obj.length && _.keys(obj),
            length = (keys || obj).length,
            results = {},
            currentKey;
        for (var index = 0; index < length; index++) {
          currentKey = keys ? keys[index] : index;
          results[currentKey] = iteratee(obj[currentKey], currentKey, obj);
        }
        if ( _.isObject( obj ) ) {
            return _.object( results ) ;
        } 
        return results;
    }
}); 

एक साधारण वर्कअराउंड जो सही कुंजी रखता है और ऑब्जेक्ट के रूप में वापस आता है यह अभी भी उसी तरह से उपयोग किया जाता है जैसे कि मैं अतिथि को इस फ़ंक्शन का उपयोग कर सकता था, जो बग को ओवरराइड करता है _.map फ़ंक्शन

या बस के रूप में मुझे यह एक मिश्रण के रूप में इस्तेमाल किया

_.mapobj ( options , function( val, key, list ) 

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.