বস্তুর জন্য মানচিত্র ফাংশন (অ্যারের পরিবর্তে)


1062

আমার একটি বিষয় রয়েছে:

myObject = { 'a': 1, 'b': 2, 'c': 3 }

আমি একটি নেটিভ পদ্ধতি খুঁজছি, এর অনুরূপ Array.prototype.mapনিম্নলিখিত হিসাবে ব্যবহৃত হবে:

newObject = myObject.map(function (value, label) {
    return value * value;
});

// newObject is now { 'a': 1, 'b': 4, 'c': 9 }

জাভাস্ক্রিপ্ট mapবস্তুর জন্য যেমন একটি ফাংশন আছে ? (আমি নোড.জেএসের জন্য এটি চাই, তাই আমি ক্রস-ব্রাউজার সম্পর্কিত বিষয়গুলির বিষয়ে চিন্তা করি না))


1
বেশিরভাগ উত্তর ব্যবহার করে Object.keys, যার কোনও সুসংজ্ঞাত অর্ডার নেই। এটি সমস্যাযুক্ত হতে পারে, আমি Object.getOwnPropertyNamesপরিবর্তে এটি ব্যবহার করার পরামর্শ দিই ।
অরিওল

14
আমার কাছে আশ্চর্যজনক যে জেএস এই অবিশ্বাস্যরূপে প্রাথমিক কাজটি সরবরাহ করে নি।
jchook

3
@ ওরিওল আপনি কি সে সম্পর্কে নিশ্চিত? এমডিএন ওয়েব ডক্স অনুসারে, অ্যারের উপাদানগুলির ক্রম Object.keysএবং এর মধ্যে সামঞ্জস্যপূর্ণ Object.getOwnPropertyNames। দেখুন developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/...
বার্ট

@ বার্ট এর আদেশ Object.keysবাস্তবায়ন নির্ভর। স্ট্যাকওভারফ্লো.com
ওরিওল

4
@ ওরিওল আপনাকে যেভাবেই বস্তুর কীগুলির ক্রমের উপর নির্ভর করার কথা নয়, সুতরাং এটির প্রশ্নটি অপ্রাসঙ্গিক - যেহেতু তিনি কখনই নির্দেশ করেননি যে আদেশটি তাঁর কাছে গুরুত্বপূর্ণ। এবং যদি অর্ডার তাঁর কাছে গুরুত্বপূর্ণ হয় তবে সে কোনও উপায়ে কোনওভাবেই ব্যবহার করা উচিত নয়।
বিটি

উত্তর:


1538

কোন নেটিভ mapকরার Objectবস্তু, কিন্তু কিভাবে এই সম্পর্কে:

var myObject = { 'a': 1, 'b': 2, 'c': 3 };

Object.keys(myObject).map(function(key, index) {
  myObject[key] *= 2;
});

console.log(myObject);
// => { 'a': 2, 'b': 4, 'c': 6 }

তবে আপনি সহজেই কোনও জিনিস ব্যবহার করে পুনরাবৃত্তি করতে পারেন for ... in:

var myObject = { 'a': 1, 'b': 2, 'c': 3 };

for (var key in myObject) {
  if (myObject.hasOwnProperty(key)) {
    myObject[key] *= 2;
  }
}

console.log(myObject);
// { 'a': 2, 'b': 4, 'c': 6 }

হালনাগাদ

প্রচুর লোক উল্লেখ করছেন যে পূর্ববর্তী পদ্ধতিগুলি কোনও নতুন অবজেক্ট ফেরত দেয় না, বরং বস্তুটিতেই চালিত হয়। এই বিষয়টির জন্য আমি আরও একটি সমাধান যুক্ত করতে চেয়েছিলাম যা একটি নতুন অবজেক্ট ফিরিয়ে দেয় এবং মূল বস্তুকে যেমন হয় তেমন ছেড়ে দেয়:

var myObject = { 'a': 1, 'b': 2, 'c': 3 };

// returns a new object with the values at each key mapped using mapFn(value)
function objectMap(object, mapFn) {
  return Object.keys(object).reduce(function(result, key) {
    result[key] = mapFn(object[key])
    return result
  }, {})
}

var newObject = objectMap(myObject, function(value) {
  return value * 2
})

console.log(newObject);
// => { 'a': 2, 'b': 4, 'c': 6 }

console.log(myObject);
// => { 'a': 1, 'b': 2, 'c': 3 }

Array.prototype.reduceকারেন্টের সাথে পূর্ববর্তী মানটি কিছুটা মার্জ করে একটি মানকে একটি অ্যারে হ্রাস করে। শৃঙ্খলটি একটি খালি বস্তু দ্বারা সূচনা করা হয় {}। প্রতিটি পুনরাবৃত্তিতে একটি নতুন কী এর myObjectদ্বিগুণ কী দিয়ে যুক্ত করা হয়।

হালনাগাদ

নতুন ES6 বৈশিষ্ট্য সঙ্গে, সেখানে প্রকাশ করার আরো একটি মার্জিত উপায় objectMap

const objectMap = (obj, fn) =>
  Object.fromEntries(
    Object.entries(obj).map(
      ([k, v], i) => [k, fn(v, k, i)]
    )
  )
  
const myObject = { a: 1, b: 2, c: 3 }

console.log(objectMap(myObject, v => 2 * v)) 


3
হ্যাঁ, আমি এই জাতীয় সমস্যার জন্য আমার সমাধানের প্রস্তাব দেব না। এজন্য আমি আমার উত্তরটি বিকল্প, আরও ভাল সমাধান সহ আপডেট করেছি।
অ্যাম্বারল্যাম্পস

1
আমি আমার উত্তর আপডেট করেছি - মনে হয় (প্রশ্নটি পুনরায় পড়ার সময়) যে ওপি একই কীগুলির সাথে একটি নতুন অবজেক্ট চায় , যেখানে সরবরাহিত ক্রিয়াকলাপের সাথে মানগুলি পরিবর্তিত করা হয়েছিল, এবং মূল বস্তুকে জায়গায় পরিবর্তন না করা উচিত।
Alnitak

13
@ খলিল রাভান্না আমার মনে হয় আপনি কোডটি এখানে ভুলভাবে পড়েছেন - এই উত্তরটি mapসঠিকভাবে ব্যবহার করছে না কারণ এটি একটি করছে না return- এটি গালি দিচ্ছে mapযেন এটি একটি forEachকল। যদি তিনি আসলে তা করেন return myObject[value] * 2 তবে ফলাফলটি দ্বিগুণ মানগুলির সাথে মূল কীগুলি ধারণ করে এমন একটি বস্তুর পরিবর্তে মূল মানগুলি দ্বিগুণ করে একটি অ্যারে হবে , দ্বিতীয়টি স্পষ্টতই ওপি চেয়েছিল।
Alnitak

3
@ অ্যাম্বল্ল্যাম্পস আপনার .reduceউদাহরণটি ঠিক আছে, তবে আইএমএইচও এটি এখনও .mapঅবজেক্টের জন্য কোনও সুবিধার্থে খুব কমই পড়েছে , যেহেতু আপনার .reduceকলব্যাকটি কেবল যেভাবে .reduceকাজ করে তার সাথে মেলে না , তবে myObjectএটি লেক্সিকাল স্কোপটিতে উপলব্ধ থাকাও প্রয়োজন । বিশেষ করে পরেরটি কলব্যাকের মধ্যে কেবল কোনও ফাংশন রেফারেন্সটি পাস করা অসম্ভব করে তোলে, পরিবর্তে কোনও স্থান-অনামী ফাংশন প্রয়োজন।
আলনিটাক

8
টিবিএইচ আমি বরং একটি উত্তর উপস্থাপন করতাম যা কেবলমাত্র (বা মূলত) এই উত্তরটিতে উপস্থাপন করা দ্বিতীয় সমাধান সরবরাহ করেছিল। প্রথমটি কাজ করে এবং অগত্যা ভুল হয় না, তবে অন্যরা যেমন বলেছে, আমি মানচিত্রটি সেভাবে ব্যবহার করা দেখতে পছন্দ করি না। আমি যখন মানচিত্রটি দেখি তখন আমার মন স্বয়ংক্রিয়ভাবে "অপরিবর্তনীয় ডেটা কাঠামো"
ভাবছে

307

প্লেইন জেএস ( ES6 / ES2015 ) এ তাত্ক্ষণিক চলক কার্যভার সহ এক লাইনারের কীভাবে ?

ব্যবহারের মেকিং বিস্তার অপারেটর এবং কম্পিউটেড কী নাম শব্দবিন্যাস:

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

jsbin

হ্রাস ব্যবহার করে অন্য সংস্করণ:

let newObj = Object.keys(obj).reduce((p, c) => ({...p, [c]: obj[c] * obj[c]}), {});

jsbin

একটি ফাংশন হিসাবে প্রথম উদাহরণ:

const oMap = (o, f) => Object.assign({}, ...Object.keys(o).map(k => ({ [k]: f(o[k]) })));

// To square each value you can call it like this:
let mappedObj = oMap(myObj, (x) => x * x);

jsbin

যদি আপনি কোনও কার্যনির্বাহী স্টাইলে পুনরাবৃত্তভাবে কোনও নেস্টেড অবজেক্টটি ম্যাপ করতে চান তবে এটি এর মতো করা যেতে পারে:

const sqrObjRecursive = obj =>
  Object.keys(obj).reduce(
    (newObj, key) =>
      obj[key] && typeof obj[key] === "object"
        ? { ...newObj, [key]: sqrObjRecursive(obj[key]) } // recurse.
        : { ...newObj, [key]: obj[key] * obj[key] }, // square val.
    {}
  );       

jsbin

বা আরও জরুরীভাবে এর মতো:

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

jsbin

ES7 / ES2016 যেহেতু আপনি যেমন এর Object.entries()পরিবর্তে ব্যবহার করতে পারেন Object.keys():

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

ES2019 চালু করা হয়েছে Object.fromEntries(), যা এটি আরও আরও সরল করে:

let newObj = Object.fromEntries(Object.entries(obj).map(([k, v]) => [k, v * v]));


উত্তরাধিকারী বৈশিষ্ট্য এবং প্রোটোটাইপ চেইন:

কিছু বিরল পরিস্থিতিতে আপনাকে কোনও শ্রেণীর মতো বস্তুর মানচিত্রের প্রয়োজন হতে পারে যা উত্তরাধিকার সূত্রে তার প্রোটোটাইপ-শৃঙ্খলে রাখা হয় । এই ধরনের ক্ষেত্রে Object.keys()কাজ করবে না, কারণ উত্তরাধিকারসূত্রে প্রাপ্ত বৈশিষ্ট্যগুলি Object.keys()গণনা করে না । আপনার যদি উত্তরাধিকারসূত্রে প্রাপ্ত বৈশিষ্ট্যগুলি মানচিত্রের প্রয়োজন হয় তবে আপনার ব্যবহার করা উচিত ।for (key in myObj) {...}

এখানে অন্য কোনও অবজেক্টের বৈশিষ্ট্য উত্তরাধিকার সূত্রে প্রাপ্ত সামগ্রীর উদাহরণ এবং কীভাবে Object.keys()এই জাতীয় দৃশ্যে কাজ করে না।

const obj1 = { 'a': 1, 'b': 2, 'c': 3}
const obj2 = Object.create(obj1);  // One of multiple ways to inherit an object in JS.

// Here you see how the properties of obj1 sit on the 'prototype' of obj2
console.log(obj2)  // Prints: obj2.__proto__ = { 'a': 1, 'b': 2, 'c': 3}

console.log(Object.keys(obj2));  // Prints: an empty Array.

for (key in obj2) {
  console.log(key);              // Prints: 'a', 'b', 'c'
}

jsbin

তবে দয়া করে আমার পক্ষে কিছু করুন এবং উত্তরাধিকার এড়ান । :-)


1
সুন্দরী তবে আমি Object.keysউত্তরাধিকার সূত্রে প্রাপ্ত গুণাগুণগুলি গণনা করে না by আমি আপনাকে একটি সতর্কতা যোগ করার পরামর্শ দিচ্ছি।
ডেভিড ব্রাউন

আপনার উত্তর সংক্ষিপ্ত করতে, কেবল ব্যবহার করুন Object.entries({a: 1, b: 2, c: 3})

1
আপনার কয়েকটি টাইপস রয়েছে (আপনি (o, f)আর্গুমেন্ট হিসাবে উল্লেখ objকরেন তবে দেহে ব্যবহার করেন
kzhel

4
হ্যাঁ এবং তারপরে পরবর্তী ব্যক্তিকে এই ফাংশনটি কী তা আবিষ্কার করে কয়েক মিনিট ব্যয় করতে দিন? :)
আন্দ্রে পোপভ

1
শূন্য বস্তু Object.assign(...Object.entries(obj).map(([k, v]) => ({[k]: v * v})))হলে সমাধানটি কাজ করে না obj। পরিবর্তন করুন: Object.assign({}, ...Object.entries(obj).map(([k, v]) => ({[k]: v * v})))
ব্ল্যাককাটওয়েব

115

কোনও নেটিভ পদ্ধতি নেই, তবে লোডাশ # ম্যাপভ্যালুগুলি দুর্দান্তভাবে কাজটি করবে

_.mapValues({ 'a': 1, 'b': 2, 'c': 3} , function(num) { return num * 3; });
// → { 'a': 3, 'b': 6, 'c': 9 }

6
কেবল একটি ফাংশনের জন্য অতিরিক্ত এইচটিটিপি কল এবং একটি অতিরিক্ত গ্রন্থাগার যুক্ত করার দরকার নেই। যাই হোক না কেন, এই উত্তরটি এখন পুরানো এবং আপনি কেবল Object.entries({a: 1, b: 2, c: 3})অ্যারে পেতে কল করতে পারেন।

10
অ্যারে পাওয়া কেন দরকারী? প্রয়োজনীয়তা একটি ম্যাপযুক্ত বস্তুর জন্য ছিল। এছাড়াও এই ধরণের জিনিসটির জন্য মূলত নির্মিত লোড্যাশ, একটি জনপ্রিয় লাইব্রেরি ব্যবহার করার ক্ষেত্রে কোনও নিবিষ্ট এইচটিটিপি কল নেই, যদিও ইএস 6 এর কয়েকটি ডিগ্রি ইউটিলিটি ফাংশন লাইব্রেরিগুলি ব্যবহারের প্রয়োজনীয়তাটিকে কিছুটা অব্যাহত রেখেছে যদিও বেশ কয়েকটি বিষয় রয়েছে।
corse32

2
লোডাশ টানতে অতিরিক্ত HTTP কল, আমার ধারণা I এটি যদি আপনার একমাত্র ব্যবহারের ক্ষেত্রে হয় তবে এটি একটি ওভারকিল। তা সত্ত্বেও, লোড্যাশের পক্ষে এই উত্তরটি প্রায় বিস্তৃত লাইব্রেরি হিসাবে বোধগম্য হয়।
igorsantos07

2
আপনাকে আসলে ব্যবহার করা উচিত বলে উল্লেখ না করা _.map()যাতে আপনি দ্বিতীয় যুক্তি হিসাবে কীটি পান - ওপি দ্বারা প্রয়োজনীয়।
igorsantos07

57

এটি একটি লেখা খুব সহজ:

Object.map = function(o, f, ctx) {
    ctx = ctx || this;
    var result = {};
    Object.keys(o).forEach(function(k) {
        result[k] = f.call(ctx, o[k], k, o); 
    });
    return result;
}

উদাহরণ কোড সহ:

> o = { a: 1, b: 2, c: 3 };
> r = Object.map(o, function(v, k, o) {
     return v * v;
  });
> r
{ a : 1, b: 4, c: 9 }

এনবি: এই সংস্করণ আপনাকে পদ্ধতির thisমতো কলব্যাকের জন্য প্রসঙ্গ সেট করতেও (বিকল্পভাবে) অনুমতি দেয় Array

সম্পাদনা - এর ব্যবহার অপসারণ করতে পরিবর্তিত হয়েছে Object.prototype, তা নিশ্চিত করার জন্য যে এটি কোনও mapবস্তুর উপরে থাকা কোনও বিদ্যমান সম্পত্তির সাথে সংঘর্ষে নয় ।


3
ঠিক আছে. :) এই প্রশ্নের একটি মন্তব্য আমাকে এখানে এনেছে। আমি এটি +1 করব যেহেতু গৃহীত উত্তরগুলি পরিষ্কারভাবে অপব্যবহার করছে map, তবে আমার অবশ্যই বলতে হবে যে এটি পরিবর্তনযোগ্য Object.prototypeনয়, এমনকি পরিবর্তনগুলি আমার সাথে ভালভাবে বসবে না।
জেএলআরিশ

2
@ জেএলআরিশ ধন্যবাদ। ইএস 5-তে আইএমএইচও-র অন্যান্য পদ্ধতির সাথে সংঘর্ষের (তাত্ত্বিক) ঝুঁকি ছাড়া অন্য কোনও পরিবর্তন করার সত্যিই কারণ নেইObject.prototype । এফডাব্লুআইডাব্লু, অন্য উত্তরটি যতটা ভোট পেয়েছে তা আমি বুঝতে পারি না, এটি সম্পূর্ণ ভুল।
Alnitak

7
@ জেএলআর রিশান আপনি একজন পুরানো গিজার ... সময় নিয়ে আসুন এবং সেই প্রোটোটাইপটি সংশোধন করুন!
নিক ম্যানিং

12
@ নিকম্যানিং আপনাকে তরুণ হুইপারস্প্যানার এবং আপনার দায়িত্বজ্ঞানহীন আচরণ। আমার লন নামা!
জেএলআরিশ

3
এই ইতিমধ্যে কাজ করে না: o = {map: true, image: false}। আপনি কেবল লেখার জন্য এটিকে ঝুঁকিরo.map(fn) মধ্যে map(o,fn)
ফেলেছেন

25

আপনি কীগুলির ফিরে আসা অ্যারে ব্যবহার করতে পারেন Object.keysএবং তারপরে forEach:

var myObject = { 'a': 1, 'b': 2, 'c': 3 },
    newObject = {};
Object.keys(myObject).forEach(function (key) {
    var value = myObject[key];
    newObject[key] = value * value;
});

বা আরও মডুলার ফ্যাশনে:

function map(obj, callback) {
    var result = {};
    Object.keys(obj).forEach(function (key) {
        result[key] = callback.call(obj, obj[key], key, obj);
    });
    return result;
}

newObject = map(myObject, function(x) { return x * x; });

নোট করুন যে Object.keysকেবলমাত্র বস্তুর নিজস্ব সংখ্যাযুক্ত বৈশিষ্ট্যযুক্ত একটি অ্যারে প্রদান করে, সুতরাং এটি for..inএকটি hasOwnPropertyচেকের সাথে লুপের মতো আচরণ করে ।


20

এটি সোজা বিএস, এবং জেএস সম্প্রদায়ের প্রত্যেকেরাই এটি জানেন। সেখানে উচিত এই কার্যকারিতা হতে:

const obj1 = {a:4, b:7};
const obj2 = Object.map(obj1, (k,v) => v + 5);

console.log(obj1); // {a:4, b:7}
console.log(obj2); // {a:9, b:12}

এখানে নির্বাক বাস্তবায়ন:

Object.map = function(obj, fn, ctx){

    const ret = {};

    for(let k of Object.keys(obj)){
        ret[k] = fn.call(ctx || null, k, obj[k]);
    });

    return ret;
};

এটি নিজেকে সর্বদা বাস্তবায়ন করতে পেরে বিরক্তিকর;)

আপনি যদি আরও কিছু পরিশীলিত কিছু চান, যা অবজেক্ট শ্রেণিতে হস্তক্ষেপ করে না, এটি চেষ্টা করুন:

let map = function (obj, fn, ctx) {
  return Object.keys(obj).reduce((a, b) => {
    a[b] = fn.call(ctx || null, b, obj[b]);
    return a;
  }, {});
};


const x = map({a: 2, b: 4}, (k,v) => {
    return v*2;
});

তবে অবজেক্টে এই মানচিত্রের ফাংশনটি যুক্ত করা নিরাপদ, কেবল অবজেক্ট.প্রোটোটাইপটিতে যুক্ত করবেন না।

Object.map = ... // fairly safe
Object.prototype.map ... // not ok

আপনি কেন বিশ্বজুড়ে এই ফাংশন যুক্ত করবেন Object? শুধু আছে const mapObject = (obj, fn) => { [...]; return ret; }
অ্যাম্বারল্যাম্পস

7
কারণ এটি অবজেক্টে একটি পদ্ধতি হওয়া উচিত :)
আলেকজান্ডার মিলস

1
যতক্ষণ না আমরা অবজেক্ট.প্রোটোটাইপ নিয়ে গণ্ডগোল করব না ততক্ষণ আমাদের ঠিক থাকা উচিত
আলেকজান্ডার মিলস

1
মানচিত্র যদি কেবল একটি এলোমেলো অস্পষ্ট জিনিস ছিল, নিশ্চিত। তবে .mapসাধারণত ফান্টর ইন্টারফেস হিসাবে বোঝা যায় এবং "অবজেক্ট" -এর জন্য ফান্টাকারের কোনও একক সংজ্ঞা নেই কারণ জাভাস্ক্রিপ্টে কার্যত কোনও কিছুই একটি বস্তু হতে পারে, যার মধ্যে তাদের নিজস্ব স্বতন্ত্র এবং সংজ্ঞায়িত। ম্যাপ ইন্টারফেস / যুক্তিযুক্ত জিনিস রয়েছে।
ডিটিপসন

1
আমার মতে কলব্যাকের প্রথম যুক্তিটি নিজেই পুনরুক্ত হওয়া উচিত, কোনও কী নয়। উদাহরণস্বরূপ আমি ধরে নিলাম এটি আমার কাছে একই জিনিস দেওয়া উচিত, যেমনটি সাধারণ মানচিত্রের সাথে সাধারণত ঘটে থাকে: অবজেক্ট.ম্যাপ ({প্রপ: 1}, এল => এল) তবে এটি একই মূল নামের সাথে কীগুলি ফেরত দেয় ...
গ্লেব ডলজিকভ

17

আমি এখানে একটি অ্যারের সাথে কোনও বস্তু ম্যাপ করার জন্য সন্ধান করতে এবং উত্তর খুঁজতে খুঁজতে এসেছি এবং ফলস্বরূপ এই পৃষ্ঠাটি পেয়েছি। আপনি যদি এখানে এসেছিলেন ঠিক একই উত্তরটির সন্ধান করতে আপনি এখানে এসেছিলেন, এখানে আপনি কীভাবে কোনও অ্যারে মানচিত্র করতে এবং আপত্তি করতে পারেন তা এখানে।

আপনি এই জাতীয় বস্তু থেকে নতুন অ্যারেটি ফেরত দিতে মানচিত্রটি ব্যবহার করতে পারেন:

var newObject = Object.keys(myObject).map(function(key) {
   return myObject[key];
});

6
এটি দূরবর্তীভাবে কাজ করে না - এটি কেবল বস্তুর মানগুলির একটি অ্যারে প্রদান করে, কোনও নতুন অবজেক্ট নয়। আমি বিশ্বাস করতে পারি না এটির অনেক বেশি ভোট রয়েছে।
অলনিটক

1
আপনি সঠিক, এটি প্রশ্নের উত্তর সঠিকভাবে দেয় না কারণ তারা কোনও বস্তুতে এবং অবজেক্টকে ম্যাপিংয়ের জন্য উত্তর খুঁজছিল। আমি এখানে একটি অ্যারের সাথে কোনও বস্তুর মানচিত্রের জন্য উত্তর খুঁজতে এসেছি এবং ফলস্বরূপ এই পৃষ্ঠাটি পেয়েছি, সুতরাং আমি আমার উত্তরটি রেখে এটিকে সম্পাদনা করব এবং প্রতিফলিত করতে এটি সম্পাদনা করব যে এটির ফলস্বরূপ যারা এখানে অর্জন করেছেন তাদের পক্ষে এটি একটি বিকল্প উত্তর অ্যারেতে কোনও বস্তু ম্যাপিংয়ের সন্ধান করছে।
জোট্রন

5
ES7 এ যা তুচ্ছভাবে হবেObject.values(myObject)
Alnitak

1
এটি জেনে ভাল, তবে কিছু লোকের এখনও উত্তরাধিকার কোড ব্যবহার করতে হয়।
জোট্রন

কনজেক্ট আপজ = {ফু: 'বার', বাজ: 42}; console.log (Object.entries (obj)); // [['foo', 'বার'], ['বাজ', 42]]
বশিরপুর

12

গৃহীত উত্তরের দুটি ত্রুটি রয়েছে:

  • এটি অপব্যবহার করে Array.prototype.reduce, কারণ হ্রাস করার অর্থ একটি যৌগিক ধরণের কাঠামো পরিবর্তন করা, যা এই ক্ষেত্রে হয় না।
  • এটি বিশেষভাবে পুনরায় ব্যবহারযোগ্য নয়

একটি ES6 / ES2015 কার্যকরী পদ্ধতির

দয়া করে নোট করুন যে সমস্ত ফাংশন ত্রিযুক্ত আকারে সংজ্ঞায়িত করা হয়েছে।

// small, reusable auxiliary functions

const keys = o => Object.keys(o);

const assign = (...o) => Object.assign({}, ...o);

const map = f => xs => xs.map(x => f(x));

const mul = y => x => x * y;

const sqr = x => mul(x) (x);


// the actual map function

const omap = f => o => {
  o = assign(o); // A
  map(x => o[x] = f(o[x])) (keys(o)); // B
  return o;
};


// mock data

const o = {"a":1, "b":2, "c":3};


// and run

console.log(omap(sqr) (o));
console.log(omap(mul(10)) (o));

  • লাইনে A oপুনরায় নিয়োগ দেওয়া হয়েছে। যেহেতু জাভাস্ক্রিপ্ট ভাগ করে রেফারেন্স মানগুলি পাস করে , এর অগভীর অনুলিপি oতৈরি হয়। আমরা এখন পিতামাতার স্কোপটিতে কোনও পরিবর্তন না করেই oমধ্যে পরিবর্তন করতে সক্ষম হয়েছি ।omapo
  • লাইনে বি mapএর রিটার্ন মান অগ্রাহ্য করা হয়, কারণ mapএকটি রূপান্তর সম্পাদন করে o। যেহেতু এই পার্শ্ব প্রতিক্রিয়াটি এর মধ্যে থেকে যায় omapএবং প্যারেন্ট স্কোপে দৃশ্যমান নয়, এটি সম্পূর্ণ গ্রহণযোগ্য।

এটি দ্রুততম সমাধান নয়, তবে একটি ঘোষণামূলক এবং পুনরায় ব্যবহারযোগ্য। এখানে এক-লাইন, সংক্ষিপ্ত কিন্তু কম পাঠযোগ্য হিসাবে একই প্রয়োগ রয়েছে:

const omap = f => o => (o = assign(o), map(x => o[x] = f(o[x])) (keys(o)), o);

সংযোজন - কেন ডিফল্টরূপে বস্তুগুলি পুনরাবৃত্ত হয় না?

ES2015 পুনরুক্তি এবং পুনরাবৃত্ত প্রোটোকল নির্দিষ্ট করেছে। কিন্তু অবজেক্টগুলি এখনও পুনরাবৃত্তিযোগ্য নয় এবং এটি ম্যাপযোগ্য নয়। কারণটি হ'ল ডেটা এবং প্রোগ্রাম স্তরের মিশ্রণ


1
দেখে মনে হচ্ছে কিছুটা ওভার ইঞ্জিনিয়ারড; মূলত একটি লুপ কীসের জন্য আমি 6 টি ফাংশন গণনা করি। অন্যান্য সমাধানগুলি অনেক সহজ এবং স্বীকৃত উত্তরগুলিও 5 গুণ বেশি দ্রুত।
fregante

4
@ bfred.it আপনার মন্তব্যের উদ্দেশ্য কী? আপনি যদি মাইক্রো-অপ্টিমাইজেশন পছন্দ করেন তবে আপনারও ব্যবহার করা উচিত নয় Array.prototype.reduce। আমি এখানে যা উদাহরণস্বরূপ বলতে চাই তা হ'ল গৃহীত উত্তরটি কোনওভাবে "আপত্তি" Array.prototype.reduceএবং কিভাবে খাঁটি কার্যকরী ম্যাপিং কার্যকর করা যেতে পারে। আপনি যদি ক্রিয়ামূলক প্রোগ্রামিংয়ে আগ্রহী না হন তবে আমার উত্তরটি উপেক্ষা করুন।

2
"হ্রাস করার অর্থ একটি যৌগিক ধরণের কাঠামো পরিবর্তন করা" আমি এটিকে সত্য বলে মনে করি না। একটি অ্যারে.রেডুস যা সঠিক একই দৈর্ঘ্যের বা এমনকি একই একই মানগুলির একটি নতুন অ্যারে উত্পাদন করে তা পুরোপুরি বৈধ। হ্রাস মানচিত্র এবং / বা ফিল্টার এর কার্যকারিতা পুনরায় তৈরি করতে ব্যবহার করা যেতে পারে (বা উভয়ই, একটি জটিল ট্রান্সডুসার হিসাবে, যার জন্য হ্রাস হ'ল ভিত্তি)। এফপিতে এটি এক ধরণের ভাঁজ এবং একই ধরণের সমাপ্তিযুক্ত ভাঁজটি এখনও একটি ভাঁজ।
ডিটিপসন

2
@ ডিটিপসন আপনি একদম ঠিক বলেছেন এ (ফান্টেক্টর) এর foldচেয়ে বেশি জেনেরিক map। তবে, ২০১ 2016 সালের মাঝামাঝি থেকে এটি আমার জ্ঞান ছিল। এটি অর্ধ শাশ্বত: ডি

1
হা, হ্যাঁ এই সমস্ত জিনিস কীভাবে আন্তঃসংযুক্ত এবং শর্তাদি এবং ইন্টারফেসগুলির বিস্তৃত বাস্তুতন্ত্রের বিষয়টি বুঝতে আমার কয়েক বছর সময় লেগেছে। এগুলি এত সহজ বলে মনে হচ্ছে এমন জিনিসগুলি অসম্ভব জটিল হয়ে উঠবে এবং এমন কিছু জিনিস যা অসম্ভব জটিল বলে মনে হয় বেশ বিচ্ছিন্নভাবে বিমূর্তভাবে দূরে সরে যায়। :)
ডিটিপসন

10

জাভাস্ক্রিপ্ট সবেমাত্র নতুন Object.fromEntriesপদ্ধতিটি পেয়েছে ।

উদাহরণ

function mapObject (obj, fn) {
  return Object.fromEntries(
    Object
      .entries(obj)
      .map(fn)
  )
}

const myObject = { a: 1, b: 2, c: 3 }
const myNewObject = mapObject(myObject, ([key, value]) => ([key, value * value]))
console.log(myNewObject)

ব্যাখ্যা

উপরের কোডটি অবজেক্টটিকে নেস্টেড অ্যারে ( [[<key>,<value>], ...]) এ রূপান্তর করে যা আপনি ম্যাপ করতে পারেন। Object.fromEntriesঅ্যারেটিকে আবার কোন বস্তুতে রূপান্তরিত করে।

এই নিদর্শন সম্পর্কে দুর্দান্ত জিনিস হ'ল ম্যাপিংয়ের সময় আপনি সহজেই অবজেক্ট কীগুলিকে অ্যাকাউন্টে নিতে পারেন।

নথিপত্র

ব্রাউজার সমর্থন

Object.fromEntriesবর্তমানে কেবলমাত্র এই ব্রাউজারগুলি / ইঞ্জিনগুলি দ্বারা সমর্থিত , তবুও পলিফিলগুলি উপলব্ধ (যেমন @ বাবেল / পলফিল )।


2
মূলত, Object.fromEntriesএর বিপরীত Object.entriesObject.entriesকী-মান জোড়ার তালিকায় কোনও বস্তুকে রূপান্তর করে। Object.fromEntriesকী-মান জোড়ের তালিকাকে কোনও বস্তুতে রূপান্তর করে।
ওড়াদ

8

সর্বনিম্ন সংস্করণ (এস)):

Object.entries(obj).reduce((a, [k, v]) => (a[k] = v * v, a), {})

আমার মনে হয় এটি টাইপোর কারণে ভুল, আমার মনে হয় আপনার Object.entries(obj).reduce((a, [k, v]) => [a[k] = v * v, a], {})বন্ধুত্বের পরিবর্তে => , কোণযুক্ত-বন্ধনী।
আলেকজান্ডার মিলস

@ আলেকজান্ডারমিলস, আমার কোডটি সঠিক। প্রথম বন্ধনীর ভিতরে কমা অপারেটর সম্পর্কে আরও পড়ুন: বিকাশকারী.মোজিলা.আর.ইন.ইউএস
ডকস / ওয়েব

এটি পেয়েছে, আপনি পরের বার এটি ব্যাখ্যা করতে চাইতে পারেন, তবে আমার ধারণা কমেন্টগুলির জন্য এটিই are
আলেকজান্ডার মিলস

1
মূলত, আমার Object.entries(obj).reduce((a, [k, v]) => {a[k] = v * v; return a}, {})
কোডটির

1
দুর্দান্ত উত্তর। Object.entries().reduceসবচেয়ে ভালো সমাধান ES6 + + .Would সঙ্গে আমি মনে করি আরো upvotes পেতে যদি এটি একটি ব্যবহার করে তা হল returnবদলে হ্রাসকারক মধ্যে বিবৃতি implicit returnএবং commaযা ঝরঝরে কিন্তু এই প্রোগ্রামটিতে পড়া কঠিন হয় - অপারেটর
Drenai

7

সর্বাধিক পারফরম্যান্সের জন্য।

যদি আপনার বস্তুটি প্রায়শই পরিবর্তিত হয় না তবে প্রায়শই পুনরাবৃত্তি করা প্রয়োজন আমি একটি স্থানীয় মানচিত্রকে ক্যাশে হিসাবে ব্যবহার করার পরামর্শ দিই।

// example object
var obj = {a: 1, b: 2, c: 'something'};

// caching map
var objMap = new Map(Object.entries(obj));

// fast iteration on Map object
objMap.forEach((item, key) => {
  // do something with an item
  console.log(key, item);
});

অবজেক্ট.এন্ট্রিগুলি ইতিমধ্যে ক্রোম, এজ, ফায়ারফক্স এবং বিটা অপেরাতে কাজ করে তাই এটি ভবিষ্যতের প্রমাণ বৈশিষ্ট্য। এটি ES7 থেকে তাই এটি পলিফিল করুন যেখানে এটি কাজ করে না সেই জন্য https://github.com/es-shims/Object.entries


ডেস্ট্রাক্টরিং ব্যবহার সম্পর্কে কীভাবে ?
Ван Ван

1
@ কে ._ এটি খুব ধীর হয়ে থাকত, তবে এখনকার পারফরম্যান্স সম্পর্কে আমি জানি না। দেখে মনে হচ্ছে ভি 8 ভি 5.6 নির্মাণের জন্য কিছু অপ্টিমাইজেশন চালু করেছে তবে তা অবশ্যই v8project.blogspot.co.uk
পাভেল

বা, কম পারফরম্যান্ট এস 7 কিন্তু অপরিবর্তনীয়:const fn = v => v * 2; const newObj = Object.entries(myObject).reduce((acc, [k,v]) => Object.assign({}, acc, {[k]: fn(v)}), {});
মাইকব্রিজ

আমি ভাবছি যে উত্তরগুলির অন্য কোনওটি কেন অবজেক্ট.এন্ট্রি ব্যবহার করে না। এটি কীগুলির উপরে পুনরাবৃত্তি করা এবং অবজেক্ট [কী] ব্যবহার করার চেয়ে অনেক বেশি পরিষ্কার।
corwin.amber

6

আপনি mapপদ্ধতি এবং forEachঅ্যারে ব্যবহার করতে পারেন তবে আপনি যদি এটি ব্যবহার করতে চান Objectতবে আপনি নীচের মত মোচড় দিয়ে এটি ব্যবহার করতে পারেন:

জাভাস্ক্রিপ্ট ব্যবহার (ES6)

var obj = { 'a': 2, 'b': 4, 'c': 6 };   
Object.entries(obj).map( v => obj[v[0]] *= v[1] );
console.log(obj); //it will log as {a: 4, b: 16, c: 36}

var obj2 = { 'a': 4, 'b': 8, 'c': 10 };
Object.entries(obj2).forEach( v => obj2[v[0]] *= v[1] );
console.log(obj2); //it will log as {a: 16, b: 64, c: 100}

JQuery ব্যবহার করে

var ob = { 'a': 2, 'b': 4, 'c': 6 };
$.map(ob, function (val, key) {
   ob[key] *= val;
});
console.log(ob) //it will log as {a: 4, b: 16, c: 36}

অথবা আপনি অন্যান্য লুপগুলিও $.eachনীচের উদাহরণের মতো পদ্ধতির মতো ব্যবহার করতে পারেন :

$.each(ob,function (key, value) {
  ob[key] *= value;
});
console.log(ob) //it will also log as {a: 4, b: 16, c: 36}

$Jquery কোথায় ?
মাস্টার্সিলো

হ্যাঁ আপনি $ এবং jQuery উভয়ই ব্যবহার করতে পারেন
হরিসিংহ গোহিল

1
@ রোনাল্ড আমি ভুল বুঝেছি, আমার আপডেট হওয়া উত্তরটি দেখুন, ডাউনভোটিং না করে সত্যই আমার ভুল সম্পর্কে সচেতন করার জন্য ধন্যবাদ, সম্প্রদায়ের উন্নতির জন্য ধন্যবাদ thanks
হরিসিংহ গোহিল

@ বিকোফেলান হ্যাঁ এটি ঠিক আমি মন্তব্যেও লিখেছি, এটি সংখ্যা বর্গাকার, আপনি কী চান?
হরিতসিংহ গোহিল

1
@ হারিতসিংহহিল আমি এটি বোঝাতে চেয়েছি যে তিনি আপনাকে jQuery সমাধান দেওয়ার জন্য সমালোচনা করছেন। এটি সত্য যে এই দিনগুলিতে jQuery থেকে সরে যাওয়ার জন্য কিছুটা উত্সাহ রয়েছে, এবং অবশ্যই নোড রয়েছে, তবে কোনও ওপি খাঁটি জেএস বা নোডের জন্য বিশেষভাবে জিজ্ঞাসা না করলে, আমি মনে করি যে কেউ কেউ একটি ওয়েব পরিবেশে কাজ করছে এবং ধরে নিয়েছে যে jQuery পাওয়া প্রায় নিশ্চিত।
আবাল্টার

4

এর map functionঅস্তিত্ব নেই Object.prototypeতবে আপনি এটির মতো অনুকরণ করতে পারেন

var myMap = function ( obj, callback ) {

    var result = {};

    for ( var key in obj ) {
        if ( Object.prototype.hasOwnProperty.call( obj, key ) ) {
            if ( typeof callback === 'function' ) {
                result[ key ] = callback.call( obj, obj[ key ], key, obj );
            }
        }
    }

    return result;

};

var myObject = { 'a': 1, 'b': 2, 'c': 3 };

var newObject = myMap( myObject, function ( value, key ) {
    return value * value;
});

পারফরম্যান্স ইস্যু: typeof callback === 'function'একেবারে নিরর্থক। 1) mapকলব্যাক ব্যতীত কোনও অর্থ নেই 2) যদি callbackকার্য না করে থাকে তবে আপনার mapবাস্তবায়নটি কেবল লুপের অর্থহীনভাবে চলে। এছাড়াও, Object.prototype.hasOwnProperty.call( obj, key )কিছুটা ওভারকিল
ankhzet

3

আমি এটি করতে শিখার চেষ্টা করে গুগল অনুসন্ধানের প্রথম-আইটেম হিসাবে এসেছি এবং ভেবেছিলাম যে আমি সম্প্রতি খুঁজে পেয়েছি এমন সমাধান খুঁজে পেতে অন্য লোকদের জন্য ভাগ করে নেব, যা এনপিএম প্যাকেজটি অপরিবর্তনীয় ব্যবহার করে।

আমি এটিকে ভাগ করে নেওয়া আগ্রহী বলে মনে করি কারণ অপরিবর্তনীয় তাদের নিজস্ব ডকুমেন্টেশনে ওপি'র সঠিক পরিস্থিতিটি ব্যবহার করে - নিম্নলিখিতটি আমার নিজস্ব কোড নয় তবে বর্তমানের অপরিবর্তনীয়-জেএস ডকুমেন্টেশন থেকে টানা:

const { Seq } = require('immutable')
const myObject = { a: 1, b: 2, c: 3 }
Seq(myObject).map(x => x * x).toObject();
// { a: 1, b: 4, c: 9 } 

এটি নয় যে সেকের অন্যান্য বৈশিষ্ট্য রয়েছে ("সেক একটি অলস ক্রিয়াকলাপ বর্ণনা করে, তাদের মধ্যবর্তী সংগ্রহগুলি তৈরি না করে উচ্চতর অর্ডার সংগ্রহের পদ্ধতিগুলি (যেমন মানচিত্র এবং ফিল্টার) এর দক্ষতার সাথে চেইন ব্যবহারের অনুমতি দেয়") এবং কিছু অপরিবর্তনীয়-জেএস ডেটা কাঠামো এছাড়াও বেশ দক্ষতার সাথে কাজ করতে পারে।

এই পদ্ধতিটি ব্যবহার করা যে কোনও ব্যক্তির অবশ্যই অবশ্যই npm install immutableডক্সটি পড়তে হবে এবং হতে পারে:

https://facebook.github.io/immutable-js/


3

সম্পাদনা: নতুন জাভাস্ক্রিপ্ট বৈশিষ্ট্যগুলি ব্যবহার করার মূল উপায় হ'ল -

const identity = x =>
  x

const omap = (f = identity, o = {}) =>
  Object.fromEntries(
    Object.entries(o).map(([ k, v ]) =>
      [ k, f(v) ]
    )
  )

যেখানে oকিছু অবজেক্ট এবং fএটি আপনার ম্যাপিংয়ের কাজ। অথবা আমরা বলতে পারি, থেকে কোনও ফাংশন দেওয়া হয় a -> bএবং প্রকারের aমানগুলির সাথে একটি বস্তু টাইপের মান সহ একটি বস্তু তৈরি করে b। সিউডো টাইপের স্বাক্ষর হিসাবে -

// omap : (a -> b, { a }) -> { b }

মূল উত্তরটি একটি শক্তিশালী সমন্বয়কারীকে প্রদর্শনের জন্য লেখা হয়েছিল, mapReduceযা আমাদের রূপান্তরকে অন্যরকমভাবে ভাবতে সহায়তা করে

  1. m, ম্যাপিং ফাংশন - আপনাকে আগে আগত উপাদানগুলিকে রূপান্তর করার সুযোগ দেয় ...
  2. r, হ্রাসকরণ ফাংশন - এই ফাংশনটি ম্যাপযুক্ত উপাদানগুলির ফলাফলের সাথে সংযোজককে একত্রিত করে

স্বজ্ঞাতভাবে, mapReduceএকটি নতুন হ্রাসকারী তৈরি করে যা আমরা সরাসরি প্লাগ করতে পারি Array.prototype.reduce। তবে আরও গুরুত্বপূর্ণ বিষয়, আমরা আমাদের অবজেক্ট ফান্টর প্রয়োগটি omapস্পষ্টভাবে অবজেক্টটি মনোয়েডকে ব্যবহার করে প্রয়োগ করতে পারি , Object.assignএবং {}

const identity = x =>
  x
  
const mapReduce = (m, r) =>
  (a, x) => r (a, m (x))

const omap = (f = identity, o = {}) =>
  Object
    .keys (o)
    .reduce
      ( mapReduce
          ( k => ({ [k]: f (o[k]) })
          , Object.assign
          )
      , {}
      )
          
const square = x =>
  x * x
  
const data =
  { a : 1, b : 2, c : 3 }
  
console .log (omap (square, data))
// { a : 1, b : 4, c : 9 }

আমাদের যে প্রোগ্রামটি লিখতে হয়েছিল তার একমাত্র অংশটি লক্ষ্য করুন তা হ'ল ম্যাপিং বাস্তবায়ন -

k => ({ [k]: f (o[k]) })

যা বলে, একটি পরিচিত বস্তু oএবং কিছু কী দেওয়া k, একটি অবজেক্ট তৈরি করুন এবং যার গুণিত সম্পত্তি কী এর মানটি kকল করার ফলাফল ,।fo[k]

আমরা mapReduceপ্রথমে বিমূর্ত হলে আমরা এর সিকোয়েন্সিং সম্ভাবনার এক ঝলক পাইoreduce

// oreduce : (string * a -> string * b, b, { a }) -> { b }
const oreduce = (f = identity, r = null, o = {}) =>
  Object
    .keys (o)
    .reduce
      ( mapReduce
          ( k => [ k, o[k] ]
          , f
          )
      , r
      )

// omap : (a -> b, {a}) -> {b}
const omap = (f = identity, o = {}) =>
  oreduce
    ( mapReduce
        ( ([ k, v ]) =>
            ({ [k]: f (v) })
        , Object.assign
        )
    , {}
    , o
    )

সবকিছু একই রকম হয় তবে omapএখন একটি উচ্চ-স্তরে সংজ্ঞায়িত করা যায়। অবশ্যই নতুন Object.entriesএই চেহারাটি মূর্খ করে তোলে তবে অনুশীলনটি এখনও শিক্ষার্থীর পক্ষে গুরুত্বপূর্ণ।

আপনি mapReduceএখানে সম্পূর্ণ সম্ভাবনা দেখতে পাবেন না , তবে আমি এই উত্তরটি ভাগ করেছি কারণ এটি ঠিক কতটি জায়গায় প্রয়োগ করা যায় তা দেখতে আকর্ষণীয়। আপনি কীভাবে এটি উত্পন্ন এবং অন্যান্য উপায়ে এটি কার্যকর হতে পারে সে বিষয়ে আগ্রহী হলে দয়া করে এই উত্তরটি দেখুন


4
পরিবর্তে আমাদের ব্যবহার করুন Mapএবং Map.entries, ঠিক আছে: ডি। আমি মানচিত্রের ডেটা ধরণের হিসাবে প্লেইন অবজেক্টগুলিকে গালি দিয়ে ক্লান্ত হয়ে পড়েছি।

2
আমি সম্মত হচ্ছি Mapযেখানে / যেখানে সম্ভব ব্যবহার করা উচিত, তবে এটি সরল জেএস বিষয়বস্তুগুলিতে এই পদ্ধতিগুলি ব্যবহারের প্রয়োজনটিকে পুরোপুরি প্রতিস্থাপন করে না: ডি
আপনাকে ধন্যবাদ

2

@ অ্যাম্বারল্যান্ডস উত্তরের উপর ভিত্তি করে, এখানে একটি ইউটিলিটি ফাংশন রয়েছে (মন্তব্য হিসাবে এটি কুৎসিত মনে হয়েছিল)

function mapObject(obj, mapFunc){
    return Object.keys(obj).reduce(function(newObj, value) {
        newObj[value] = mapFunc(obj[value]);
        return newObj;
    }, {});
}

এবং ব্যবহারটি হ'ল:

var obj = {a:1, b:3, c:5}
function double(x){return x * 2}

var newObj = mapObject(obj, double);
//=>  {a: 2, b: 6, c: 10}

2
var myObject = { 'a': 1, 'b': 2, 'c': 3 };


Object.prototype.map = function(fn){
    var oReturn = {};
    for (sCurObjectPropertyName in this) {
        oReturn[sCurObjectPropertyName] = fn(this[sCurObjectPropertyName], sCurObjectPropertyName);
    }
    return oReturn;
}
Object.defineProperty(Object.prototype,'map',{enumerable:false});





newObject = myObject.map(function (value, label) {
    return value * value;
});


// newObject is now { 'a': 1, 'b': 4, 'c': 9 }

enumerableডিফল্টfalse
আপনাকে ধন্যবাদ

2

আমার প্রতিক্রিয়া মূলত এখানে সর্বাধিক রেট প্রাপ্ত প্রতিক্রিয়াটির উপর ভিত্তি করে এবং আশা করা যায় যে প্রত্যেকে বুঝতে পারে (আমার গিটহাবের উপরও একই ব্যাখ্যা রয়েছে)। এই কারণেই মানচিত্রে তাঁর অভিশংসন কাজ করে:

Object.keys(images).map((key) => images[key] = 'url(' + '"' + images[key] + '"' +    
')');

ফাংশনটির উদ্দেশ্য হ'ল কোনও বস্তু গ্রহণ করা এবং বিন্যাস ছাড়াই সমস্ত বস্তুর (বস্তু এবং অ্যারেগুলিতে একইভাবে) উপলব্ধ পদ্ধতি ব্যবহার করে অবজেক্টের মূল বিষয়বস্তুগুলি সংশোধন করা। জেএসের প্রায় প্রতিটি জিনিসই একটি অবজেক্ট এবং সেই কারণে উত্তরাধিকারের পাইপলাইনের নিচে থাকা উপাদানগুলি লাইনটি আপ করার জন্য উপলভ্যদের প্রযুক্তিগতভাবে ব্যবহার করতে পারে (এবং এটি বিপরীতে প্রদর্শিত হবে)।

এটি কাজ করার কারণটি। ম্যাপ ফাংশনগুলির কারণে একটি অ্যারে পুনরুদ্ধার করে যা আপনি কোনও বিদ্যমান অবজেক্টকে কেবল পরিবর্তিত করার পরিবর্তে কোনও অ্যারের সুস্পষ্ট বা অন্তর্নিহিত রিটার্ন সরবরাহ করেন। আপনি অবজেক্ট.কিগুলি ব্যবহার করে অবজেক্টটিকে একটি অ্যারে মনে করার জন্য প্রোগ্রামটি মূলত কৌতুক করেন যা আপনাকে পৃথক কীগুলির সাথে সম্পর্কিত মানগুলির সাথে মানচিত্রের ক্রিয়াটি ব্যবহার করার অনুমতি দেবে (আমি আসলে দুর্ঘটনাক্রমে অ্যারেগুলি ফিরিয়ে দিয়েছি তবে এটি ঠিক করেছি)। যতক্ষণ না স্বাভাবিক অর্থে কোনও রিটার্ন আসে না, ততক্ষণ অরিজিনাল এবং অজানা হিসাবে প্রোগ্রামিং হিসাবে পরিবর্তিত মূল অবজেক্টের সাথে কোনও অ্যারে তৈরি করা হবে না।

এই নির্দিষ্ট প্রোগ্রামটি ইমেজ নামক একটি অবজেক্ট নেয় এবং এর কীগুলির মান নেয় এবং অন্য ফাংশনের মধ্যে ইউআরএল ট্যাগ যুক্ত করে। আসল এটি:

var images = { 
snow: 'https://www.trbimg.com/img-5aa059f5/turbine/bs-md-weather-20180305', 
sunny: 'http://www.cubaweather.org/images/weather-photos/large/Sunny-morning-east-   
Matanzas-city- Cuba-20170131-1080.jpg', 
rain: 'https://i.pinimg.com/originals/23/d8
/ab/23d8ab1eebc72a123cebc80ce32b43d8.jpg' };

... এবং পরিবর্তিত এটি হ'ল:

var images = { 
snow: url('https://www.trbimg.com/img-5aa059f5/turbine/bs-md-weather-20180305'),     
sunny: url('http://www.cubaweather.org/images/weather-photos/large/Sunny-morning-   
east-Matanzas-city- Cuba-20170131-1080.jpg'), 
rain: url('https://i.pinimg.com/originals/23/d8
/ab/23d8ab1eebc72a123cebc80ce32b43d8.jpg') 
};

কোনও প্রত্যাবর্তন না পাওয়া অবধি অবজেক্টের মূল কাঠামোটি সাধারণ সম্পত্তি অ্যাক্সেসের অনুমতি দিয়ে অক্ষত রয়েছে। এটি স্বাভাবিকের মতো কোনও অ্যারে ফেরত দেবেন না এবং সবকিছু ঠিক থাকবে। লক্ষ্যটি যা চেয়েছিল এবং যা কিছুই নয় তার মূল মানগুলি (চিত্রগুলি [কী]) পুনরায় নির্ধারণ করা। যতদূর আমি জানি, অ্যারে আউটপুট প্রতিরোধের জন্য এখানে চিত্রগুলির [REASSIGNMENT] থাকতে হবে এবং কোনও অ্যারে ফেরত দেওয়ার জন্য কোনও স্পষ্ট বা সুস্পষ্ট অনুরোধ নেই (ভেরিয়েবল অ্যাসাইনমেন্টটি এটি করে এবং আমার জন্য পিছনে পিছনে ছিল)।

সম্পাদনা করুন:

মূল অবজেক্টটি সংশোধন করা এড়াতে নতুন অবজেক্ট তৈরি সম্পর্কিত তাঁর অন্যান্য পদ্ধতিতে সম্বোধন করা (এবং দুর্ঘটনাক্রমে আউটপুট হিসাবে কোনও অ্যারে তৈরি এড়াতে পুনরায় নিয়োগটি এখনও প্রয়োজনীয় বলে মনে হচ্ছে)। এই ফাংশনগুলি তীর সিনট্যাক্স ব্যবহার করে এবং যদি আপনি কেবল ভবিষ্যতের ব্যবহারের জন্য একটি নতুন অবজেক্ট তৈরি করতে চান।

const mapper = (obj, mapFn) => Object.keys(obj).reduce((result, key) => {
                result[key] = mapFn(obj)[key];
                return result;
            }, {});

var newImages = mapper(images, (value) => value);

এই ফাংশনগুলি যেভাবে কাজ করে তা হ'ল:

ম্যাপএফএন ফাংশনটি পরে যুক্ত করার জন্য নেয় (এই ক্ষেত্রে (মান) => মান) এবং ম্যাপএফএন-তে (কী হিসাবে তার মতো রিটার্ন মান পরিবর্তন করে যদি দুটি দ্বারা গুণিত হয়) সেই কীটির মান হিসাবে (বা দুটি দ্বারা গুণিত হয়) হিসাবে যা কিছু সঞ্চিত থাকে কেবল তা ফিরিয়ে দেয় ( obj) [মূল],

এবং তারপরে [কী] = mapFn (আপত্তি) [কী] ফলাফলের সাথে সম্পর্কিত মূল মানের পুনরায় সংজ্ঞা দেয়

এবং ফলাফল অনুযায়ী সঞ্চালিত অপারেশনটি ফেরত দেয় (.ড্রেস ফাংশনের শেষে বন্ধনীগুলিতে অবস্থিত সংযোজক)।

এগুলি সমস্তই নির্বাচিত অবজেক্টে সম্পাদিত হচ্ছে এবং এখনও সেখানে ফিরে আসা অ্যারের জন্য একটি অন্তর্নিহিত অনুরোধ হতে পারে না এবং কেবলমাত্র আমি যতটা বলতে পারি মানগুলি পুনরায় অর্পণ করার সময় কাজ করে। এর জন্য কিছু মানসিক জিমন্যাস্টিকস প্রয়োজন তবে উপরে দেখা যায় এমন কোডের লাইনগুলি হ্রাস করে। আউটপুট ঠিক একই রকম যা নীচে দেখা যায়:

{snow: "https://www.trbimg.com/img-5aa059f5/turbine/bs-   
md-weather-20180305", sunny: "http://www.cubaweather.org/images/weather-
photos/lmorning-east-Matanzas-city-Cuba-20170131-1080.jpg", rain: 
"https://i.pinimg.com/originals/23/d8
/ab/23d8ab1eebc72a123cebc80ce32b43d8.jpg"}

মনে রাখবেন এটি নন-সংখ্যাগুলির সাথে কাজ করেছে। আপনি মানচিত্রএফএন ফাংশনটিতে ভ্যালুটি ফিরে আসার মাধ্যমে যে কোনও বস্তুর নকল করতে পারেন।


2

প্রথম ফাংশন প্রশ্নের উত্তর দেয়। এটি একটি মানচিত্র তৈরি করে।

দ্বিতীয় ফাংশন কোনও মানচিত্র তৈরি করে না। পরিবর্তে, এটি ব্যবহার করে বিদ্যমান অবজেক্টের বৈশিষ্ট্য ব্যবহার করে লুপ হয় hasOwnProperty()। এই মানচিত্র বিকল্প কিছু পরিস্থিতিতে একটি ভাল সমাধান হতে পারে।

var myObject = { 'a': 1, 'b': 2, 'c': 3 }


//creates a map (answers question, but function below is 
//much better in some situations)
var newObject = {};
makeMap();    
function makeMap() {
    for (var k in myObject) {
        var value = myObject[k];
        newObject[k] = value * value;
    }
    console.log(newObject); //mapped array
}


//Doesn't create a map, just applies the function to
//a specific property using existing data
function getValue(key) {
  for (var k in myObject) {
    if (myObject.hasOwnProperty(key)) {
      var value = myObject[key]
      return value * value; //stops iteration
    }
  }
}
Input: <input id="input" value="" placeholder="a, b or c"><br>
Output:<input id="output"><br>
<button onclick="output.value=getValue(input.value)" >Get value</button>


2
এটি আসল প্রশ্নের উত্তর দেয় না - এটি কোনও সরবরাহ করা ফাংশন (যেমন এটি অ্যারে.প্রোটোটাইপ.ম্যাপের মতো কিছুই নয়) দিয়ে কোনও নতুন অবজেক্টে মানগুলি ম্যাপিং করে না।
ম্যাট ব্রাউন

@ ম্যাটব্রাউন আমি একটি দ্বিতীয় পদ্ধতি যুক্ত করেছি যা যুক্তিযুক্তভাবে একটি মানচিত্র তৈরি করে। এটি ধীর, তবে ওপি যা অনুরোধ করে তা করে। প্রথম পদ্ধতিটি অনেক পরিস্থিতিতে আদর্শ, সেজন্য আমি একটি লুপ এবং সম্পত্তি ফাংশন ব্যবহার করি।
ভিক্টর স্টডার্ডার্ড

1

আপনি যদি mapকেবল মানগুলিই নয় তবে কীগুলিও পিং করতে আগ্রহী হন , আমি লিখেছি Object.map(valueMapper, keyMapper), এটি এইভাবে আচরণ করে:

var source = { a: 1, b: 2 };
function sum(x) { return x + x }

source.map(sum);            // returns { a: 2, b: 4 }
source.map(undefined, sum); // returns { aa: 1, bb: 2 }
source.map(sum, sum);       // returns { aa: 2, bb: 4 }

3
আমি ধরে নিলাম কারণ আপনি মূলত একটি উত্তর হিসাবে একটি লিঙ্ক সরবরাহ করেছেন, যা নীচু করা হয়েছে।
ক্রিস রাইট

কখনও কারো জন্য দরকারী: npm install @mattisg/object.map
MattiSG

1

আমার এমন একটি সংস্করণ দরকার ছিল যা কীগুলিও সংশোধন করার অনুমতি দেয় (@ অ্যাম্বারল্যান্ডস এবং @ ইয়োন্যাটানম্ন উত্তরের উপর ভিত্তি করে);

var facts = [ // can be an object or array - see jsfiddle below
    {uuid:"asdfasdf",color:"red"},
    {uuid:"sdfgsdfg",color:"green"},
    {uuid:"dfghdfgh",color:"blue"}
];

var factObject = mapObject({}, facts, function(key, item) {
    return [item.uuid, {test:item.color, oldKey:key}];
});

function mapObject(empty, obj, mapFunc){
    return Object.keys(obj).reduce(function(newObj, key) {
        var kvPair = mapFunc(key, obj[key]);
        newObj[kvPair[0]] = kvPair[1];
        return newObj;
    }, empty);
}

factObject =

{
"asdfasdf": {"color":"red","oldKey":"0"},
"sdfgsdfg": {"color":"green","oldKey":"1"},
"dfghdfgh": {"color":"blue","oldKey":"2"}
}

সম্পাদনা: প্রারম্ভিক অবজেক্ট {in এ পাস করার জন্য সামান্য পরিবর্তন} এটি হতে দেয় [] (কীগুলি যদি পূর্ণসংখ্যা হয়)


1

আমি বিশেষভাবে একই ফাংশনটি ব্যবহার করতে চেয়েছিলাম যা আমি কোনও একক বস্তুর জন্য অ্যারে ব্যবহার করেছিলাম এবং এটি সহজ রাখতে চেয়েছিলাম। এটি আমার পক্ষে কাজ করেছে:

var mapped = [item].map(myMapFunction).pop();

এটি এর চেয়ে আলাদা নয়var mapped = myMapFunction(item)
ধন্যবাদ

এটি এখানে দেখানো অন্যান্য সমস্ত "রকেট বিজ্ঞান" সমাধানগুলির চেয়ে অনেক সহজ। ভাগ করে নেওয়ার জন্য ধন্যবাদ :)
ইউরি টিক্সিরা

1

আর কি নিবিড়ভাবে সাড়া করতে অবিকল ওপি চাইলেন, অপ একটি বস্তু চায়:

myObject = { 'a': 1, 'b': 2, 'c': 3 }

একটি মানচিত্র পদ্ধতি আছে myObject.map,

নিম্নলিখিত হিসাবে ব্যবহৃত হবে যে অ্যারে.প্রোটোটাইপ.ম্যাপ অনুরূপ:

newObject = myObject.map (ফাংশন (মান, লেবেল) {
    রিটার্ন মান * মান;
});
// নতুনঅবজেক্ট এখন {'এ': 1, 'বি': 4, 'সি': 9 is

এই প্রোগ্রামটিতে সেরা ( "করার পরিপ্রেক্ষিতে মাপা কি জিজ্ঞাসা করা হয় পাসে ," + "কোন ইএস {5,6,7} অযথা প্রয়োজনীয়") উত্তর হবে:

myObject.map = function mapForObject(callback)
{
  var result = {};
  for(var property in this){
    if(this.hasOwnProperty(property) && property != "map"){
      result[property] = callback(this[property],property,this);
    }
  }
  return result;
}

উপরের কোডটি ইচ্ছাকৃতভাবে কোনও ভাষা বৈশিষ্ট্য ব্যবহার করা এড়িয়ে চলে, কেবলমাত্র সাম্প্রতিক ECMAScript সংস্করণগুলিতে। উপরের কোডটি দিয়ে সমস্যার সমাধান করা যেতে পারে যেমন:

myObject = { 'a': 1, 'b': 2, 'c': 3 };

myObject.map = function mapForObject(callback)
{
  var result = {};
  for(var property in this){
    if(this.hasOwnProperty(property) && property != "map"){
      result[property] = callback(this[property],property,this);
    }
  }
  return result;
}

newObject = myObject.map(function (value, label) {
  return value * value;
});
console.log("newObject is now",newObject);
বিকল্প পরীক্ষার কোড এখানে

কারও কারও মনে ভীতু হওয়া ছাড়াও প্রোটোটাইপ চেইনে সমাধানটি সন্নিবেশ করা সম্ভব হবে a

Object.prototype.map = function(callback)
{
  var result = {};
  for(var property in this){
    if(this.hasOwnProperty(property)){
      result[property] = callback(this[property],property,this);
    }
  }
  return result;
}

এমন কিছু, যা সাবধানতার সাথে তদারকি করার পরে কোনও খারাপ প্রভাব ফেলতে হবে না এবং mapঅন্যান্য বস্তুর (যেমন অ্যারেগুলির map) কোনও প্রভাব ফেলবে না ।


1

প্রথমে অবজেক্ট.এন্ট্রি (সংগ্রহ) ব্যবহার করে আপনার এইচটিএমএল সংগ্রহটি রূপান্তর করুন। তারপরে এটি পুনরাবৃত্তিযোগ্য আপনি এখন এটিতে .map পদ্ধতি ব্যবহার করতে পারেন।

Object.entries(collection).map(...)

রেফারেন্স https://medium.com/@js_tut/calling-javascript-code-on-m Multipleple- div- eferences- without- the- id- attribute- 97ff6a50f31


1

একটি ফাংশন মানচিত্রের সংজ্ঞা দিন।

mapEntries একটি কলব্যাক ফাংশন নেয় যা পরামিতিগুলির মান, কী এবং অবজেক্টের সাথে অবজেক্টের প্রতিটি প্রবেশের জন্য ডাকা হয়। এটি একটি নতুন মান প্রদান করা উচিত।

ম্যাপএন্ট্রিগুলিকে কলব্যাক থেকে ফিরে আসা নতুন মানগুলির সাথে একটি নতুন অবজেক্ট ফিরিয়ে দেওয়া উচিত।

Object.defineProperty(Object.prototype, 'mapEntries', {
  enumerable: false,
  value: function (mapEntriesCallback) {
    return Object.fromEntries(
      Object.entries(this).map(
        ([key, value]) => [key, mapEntriesCallback(value, key, this)]
      )
    )
  }
})


// Usage example:

var object = {a: 1, b: 2, c: 3}
var newObject = object.mapEntries(value => value * value)
console.log(newObject)
//> {a: 1, b: 4, c: 9}

সম্পাদনা: পূর্ববর্তী সংস্করণে এটি উল্লেখ করা যায় নি যে এটি একটি গণনামূলক সম্পত্তি নয়


0

আরে একটি সামান্য ম্যাপার ফাংশন লিখেছিল যা সাহায্য করতে পারে।

    function propertyMapper(object, src){
         for (var property in object) {   
           for (var sourceProp in src) {
               if(property === sourceProp){
                 if(Object.prototype.toString.call( property ) === '[object Array]'){
                   propertyMapper(object[property], src[sourceProp]);
                   }else{
                   object[property] = src[sourceProp];
                }
              }
            }
         }
      }

1
আমার ধারণা আপনি "আরে" এর পরিবর্তে "আমি" বলতে চেয়েছিলেন
কার্লো

0

এটির ভিন্ন ভিন্ন উপায় হ'ল একটি কাস্টম জসন স্ট্রিংফাই ফাংশন ব্যবহার করা যা গভীর বস্তুগুলিতেও কাজ করতে পারে। এটি কার্যকর হতে পারে যদি আপনি যাসন হিসাবে কোনওভাবে এটি সার্ভারে পোস্ট করতে চান

const obj = { 'a': 1, 'b': 2, x: {'c': 3 }}
const json = JSON.stringify(obj, (k, v) => typeof v === 'number' ? v * v : v)

console.log(json)
console.log('back to json:', JSON.parse(json))


0

আমি ছাড়গুলি হ্রাস করার জন্য কেবল স্ট্রিংগুলি পরিচালনা করি:

Object.keys(params).map(k => typeof params[k] == "string" ? params[k] = params[k].trim() : null);

0

টাইপস্ক্রিপ্টে অবজেক্ট ম্যাপার

আমি উদাহরণ ব্যবহার মত Object.fromEntriesযেমন এই এক , কিন্তু এখনও, তারা খুব সহজে ব্যবহার করা হয় না। যে উত্তরগুলি ব্যবহার করে Object.keysএবং তারপরে সন্ধান করা হয় keyসেগুলি প্রকৃতপক্ষে একাধিক লুক আপ করছে যা প্রয়োজনীয় নাও হতে পারে।

আমার ইচ্ছা ছিল কোনও Object.mapফাংশন রয়েছে তবে আমরা আমাদের নিজস্ব তৈরি করতে পারি এবং এটি objectMapউভয়কেই সংশোধন করার ক্ষমতা দিয়ে কল করতে পারি keyএবং value:

ব্যবহার (জাভাস্ক্রিপ্ট):

const myObject = { 'a': 1, 'b': 2, 'c': 3 };

// keep the key and modify the value
let obj = objectMap(myObject, val => val * 2);
// obj = { a: 2, b: 4, c: 6 }


// modify both key and value
obj = objectMap(myObject,
    val => val * 2 + '',
    key => (key + key).toUpperCase());
// obj = { AA: '2', BB: '4', CC: '6' }

কোড (টাইপস্ক্রিপ্ট):

interface Dictionary<T> {
    [key: string]: T;
}

function objectMap<TValue, TResult>(
    obj: Dictionary<TValue>,
    valSelector: (val: TValue, obj: Dictionary<TValue>) => TResult,
    keySelector?: (key: string, obj: Dictionary<TValue>) => string,
    ctx?: Dictionary<TValue>
) {
    const ret = {} as Dictionary<TResult>;
    for (const key of Object.keys(obj)) {
        const retKey = keySelector
            ? keySelector.call(ctx || null, key, obj)
            : key;
        const retVal = valSelector.call(ctx || null, obj[key], obj);
        ret[retKey] = retVal;
    }
    return ret;
}

আপনি যদি টাইপস্ক্রিপ্ট ব্যবহার না করে থাকেন তবে জাভাস্ক্রিপ্ট কোড পেতে টাইপস্ক্রিপ্ট প্লেগ্রাউন্ডে উপরের কোডটি অনুলিপি করুন ।

এছাড়াও, কারনেই আমি করা keySelectorপর valSelectorপ্যারামিটার তালিকায়, কারণ এটি ঐচ্ছিক হয়।

* কিছু ক্রেডিট আলেকজান্ডার-মিলগুলির উত্তরে যায়


0
const mapObject = (targetObject, callbackFn) => {
    if (!targetObject) return targetObject;
    if (Array.isArray(targetObject)){
        return targetObject.map((v)=>mapObject(v, callbackFn))
    }
    return Object.entries(targetObject).reduce((acc,[key, value]) => {
        const res = callbackFn(key, value);
        if (!Array.isArray(res) && typeof res ==='object'){
            return {...acc, [key]: mapObject(res, callbackFn)}
        }
        if (Array.isArray(res)){
            return {...acc, [key]: res.map((v)=>mapObject(v, callbackFn))}
        }
        return {...acc, [key]: res};
    },{})
};
const mapped = mapObject(a,(key,value)=> {
    if (!Array.isArray(value) && key === 'a') return ;
    if (!Array.isArray(value) && key === 'e') return [];
    if (!Array.isArray(value) && key === 'g') return value * value;
    return value;
});
console.log(JSON.stringify(mapped)); 
// {"b":2,"c":[{"d":2,"e":[],"f":[{"g":4}]}]}

এই ফাংশনটি অবজেক্টের অবজেক্ট এবং অ্যারেগুলির মাধ্যমে পুনরাবৃত্ত হয়। অপরিবর্তিত থাকলে ফিরিয়ে আনা হবে বৈশিষ্ট্যগুলি

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