বস্তু সংরক্ষণের কীগুলির উপরে মানচিত্র


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}

: আপনি, আমার মত, এখানে একটি 'mapValues' এর জন্য ফাংশন যা একটি নতুন এক ফেরার প্রকৃত বস্তু পরিবর্তন পরিবর্তে মত খুঁজছেন এসে থাকে, তাহলে এই সহজ সমাধান পরীক্ষা stackoverflow.com/questions/30894044/...
মাইকেল Trouw

উত্তর:


228

সঙ্গে আন্ডারস্কোর

অ্যান্ডস্কোর _.mapObjectমানগুলি মানচিত্র করতে এবং কীগুলি সংরক্ষণ করার জন্য একটি ফাংশন সরবরাহ করে।

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

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

DEMO


সঙ্গে Lodash

লোড্যাশ _.mapValuesমানগুলি মানচিত্র করতে এবং কীগুলি সংরক্ষণ করার জন্য একটি ফাংশন সরবরাহ করে।

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

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

DEMO


একটি _.mapValues ​​ফাংশনটিকে আন্ডারস্কোরে আনার চেষ্টা হয়েছে: প্রাসঙ্গিক ইস্যু , _.ম্যাপভ্যালুগুলির জন্য অনুরোধ টানুন । আমি আশা করি এটি
পেরিয়ে

আমার কাছে দেখে মনে হচ্ছে আপনি কোনও অবজেক্টে ওবিজেইসিটি তৈরি করছেন, নাকি আমি আমার মন থেকে দূরে আছি?
jsh

@jsh এই ক্ষেত্রে, _.map()ফিরে আসছে [['one', 3], ['two', 6], ['three', 9]], যা অ্যারেগুলির একটি অ্যারে এবং _.object()এটিকে আবার কোনও বস্তুতে পরিণত করছে।
জেজেন থমাস 10

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
লড্যাশ ব্যবহারকারীদের জন্য নোট: jdalton এই পরিবর্তনের উপর আন্ডারস্কোর.জেএস এর সাথে সামঞ্জস্যতা ভঙ্গ করার সিদ্ধান্ত নিয়েছে । লোডাশ সমর্থন করবে না mapObject; mapValuesপরিবর্তে লোডাশের পদ্ধতিটি দেখুন ।
মার্ক আমেরিকা

13

সরল জেএস ( ES6 / ES2015 ) এ এই সংস্করণটি সম্পর্কে কীভাবে ?

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

jsbin

আপনি যদি কোনও বস্তুর উপরে পুনরাবৃত্তভাবে মানচিত্র করতে চান (মানচিত্রে নেস্টেট অবজেক্ট ), এটি এটি করা যেতে পারে:

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

আমি জানি এটি অনেক দিন হয়ে গেছে, তবে এখনও ভাঁজ (জেএস-এ হ্রাস) এর মাধ্যমে সবচেয়ে সুস্পষ্ট সমাধান অনুপস্থিত, সম্পূর্ণতার জন্য আমি এটিকে এখানে রেখে দেব:

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 = 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;
    }
}); 

একটি সাধারণ কাজ

বা কেবল হিসাবে আমি এটি একটি মিশ্রণ হিসাবে ব্যবহার

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

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.