.map () একটি জাভাস্ক্রিপ্ট ES6 মানচিত্র?


98

আপনি এই কিভাবে করবেন? সহজাতভাবে, আমি এটি করতে চাই:

var myMap = new Map([["thing1", 1], ["thing2", 2], ["thing3", 3]]);

// wishful, ignorant thinking
var newMap = myMap.map((key, value) => value + 1); // Map { 'thing1' => 2, 'thing2' => 3, 'thing3' => 4 }

আমি নতুন পুনরাবৃত্তির প্রোটোকলের ডকুমেন্টেশন থেকে খুব বেশি পরিমাণে সংগ্রহ করতে পারি নি ।

আমি সতর্ক wu.js , কিন্তু আমি একটি চলমান করছি হট্টগোল প্রকল্প এবং অন্তর্ভুক্ত করতে চান Traceur , যা মনে হয় মত এটি বর্তমানে উপর নির্ভর করে

আমার নিজের প্রকল্পে কীভাবে ফিটজেন / ডাব্লু.জেএস এটি করেছে তা কীভাবে নিষ্কাশন করতে হয় সে সম্পর্কে আমিও কিছুটা নির্বোধ

আমি এখানে কী মিস করছি তার স্পষ্ট, সংক্ষিপ্ত ব্যাখ্যাটি পছন্দ করতে চাই। ধন্যবাদ!


ES6 মানচিত্রের জন্য ডক্স , এফওয়াইআই


আপনি কি ব্যবহার করতে পারবেন Array.from?
রাই-

@ মিনিটেক সম্ভবত একটি পলিফিল দিয়ে ... এটি ছাড়া এটি করার কোনও উপায় নেই?
নীজার

ভাল, আপনি পুনরায় mapব্যবহারযোগ্য ব্যবহার করে নিজের ফাংশন লিখতে পারেন for of
রাই-

সুপার নিটপিক, তবে আপনি যদি সত্যই কোনও মানচিত্রের উপরে মানচিত্র তুলতে চলেছেন তবে আপনি শেষে একটি মানচিত্র ফিরে পাবেন। অন্যথায় আপনি কেবল প্রথমে একটি মানচিত্রকে একটি অ্যারে রূপান্তর করছেন এবং একটি অ্যারেতে ম্যাপিং করছেন, মানচিত্রটি মানচিত্রে নয়) p আপনি একটি আইএসও ব্যবহার করে সহজেই মানচিত্রে মানচিত্র তৈরি করতে পারেন: ডাইম্যাপ (x => [... এক্স], এক্স => নতুন মানচিত্র (এক্স));
ডিটিপসন

@ ভাল থাকুন, আমরা সম্ভবত আমাদের নিজস্ব প্রোগ্রামিং ভাষা লিখতে পারি, তবে কেন ..? এটি বেশ সহজ জিনিস এবং বেশিরভাগ প্রোগ্রামিং ভাষায় বহু দশক ধরে বিদ্যমান।
রুটেক্স

উত্তর:


79

সুতরাং .mapনিজেই কেবল সেটির জন্য একটি মূল্য সরবরাহ করে ... এটি বলেছে, এটি মোকাবেলার কয়েকটি উপায় রয়েছে:

// instantiation
const myMap = new Map([
  [ "A", 1 ],
  [ "B", 2 ]
]);

// what's built into Map for you
myMap.forEach( (val, key) => console.log(key, val) ); // "A 1", "B 2"

// what Array can do for you
Array.from( myMap ).map(([key, value]) => ({ key, value })); // [{key:"A", value: 1}, ... ]

// less awesome iteration
let entries = myMap.entries( );
for (let entry of entries) {
  console.log(entry);
}

দ্রষ্টব্য, আমি দ্বিতীয় দ্বিতীয়টিতে প্রচুর নতুন স্টাফ ব্যবহার করছি ... ... যে Array.fromকোনও পুনরাবৃত্ত হওয়া লাগে (যে কোনও সময় আপনি ব্যবহার করতে চান [].slice.call( ), প্লাস সেট এবং মানচিত্র) এবং এটিকে অ্যারেতে রূপান্তরিত করে ... ... মানচিত্র যখন কোনও অ্যারেতে জোর করা হয় তখন অ্যারের অ্যারেতে পরিণত করুন, যেখানে el[0] === key && el[1] === value;(মূলত, একই ধরণের যেটিতে আমি আমার উদাহরণের সাথে মানচিত্রের উপরের চিত্রটি দিয়েছি)।

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

আপনি যদি বাবেলকে উত্পাদন হিসাবে ব্যবহার করছেন তবে আপনাকে বাবেলের ব্রাউজার পলিফিল ব্যবহার করতে হবে (যার মধ্যে "কোর-জেএস" এবং ফেসবুকের "রিজেনেটর" রয়েছে)।
আমি এটি যথেষ্ট নিশ্চিত Array.from


হ্যাঁ, কেবল দেখে মনে হচ্ছে এটি Array.fromকরার জন্য আমার প্রয়োজন হবে । আপনার প্রথম উদাহরণ একটি অ্যারে ফেরত দেয় না, বিটিডব্লিউ।
নীজার

@ নিউজার না, তা হয় না। প্রত্যাশিত ব্যবহারটি একটি সাধারণ পার্শ্ব-প্রতিক্রিয়া ভিত্তিক পুনরাবৃত্তি (ES5 সাল থেকে এটি একই রকম) হিসাবে প্রত্যাশিত ব্যবহার, সর্বদা সমতল .forEachফিরে আসে । যাতে ব্যবহার করতে , হয় আপনি মাধ্যমে বলেন একটি অ্যারের গড়ে তুলতে এবং এটি দ্বারা হাত নিয়ে আসতে 'চান চাই দ্বারা ফিরে বা পুনরুক্তিকারীর মাধ্যমে বা বা । মন-বাঁকানো অনন্য কিছু করছে না, এটি কেবল ট্র্যাভ্রসালকে বলে সেই বিশেষ কদর্যতা লুকিয়ে রেখেছে। এবং হ্যাঁ, আপনি যা পেয়েছেন তা অন্তর্ভুক্ত করে (বা এটি যাই হোক না কেন) তা পরীক্ষা করে দেখুন ...undefinedforEachforEachforEach.entries().keys( ).values( )Array.frombabel-core/browser.js.from
নরগার্ড

4
আমার উত্তর দেখুন, Array.fromএকটি মানচিত্র ফর্মটি পরম হিসাবে গ্রহণ করে, আপনাকে কেবল এটির উপরে ম্যাপ করার জন্য একটি অস্থায়ী অ্যারে তৈরি করতে হবে না এবং এটি বাতিল করতে হবে।
লোগানফস্মিথ

আপনি কী ব্যাখ্যা করতে পারেন যে কেন বস্তুর চারপাশে মোড়ানো একটি বন্ধনী প্রয়োজন? আমি এখনও ES6 এ কিছুটা নতুন এবং সে অংশটি বুঝতে সমস্যা হচ্ছি। বিকাশকারী.মোজিলা.আর.ইন-
ইউএস

4
@ ডিটিসি হ্যাঁ, আপনি যখন লেখেন এমন কোনও বস্তু const obj = { x: 1 };যখন আপনি লেখেন , যখন আপনি কোনও কোডের ব্লক লেখেন, আপনি লিখেন if (...) { /* block */ }, যখন আপনি লিখেন একটি তীর ফাংশন আপনি লিখেন () => { return 1; }, তখন এটি কীভাবে জানবে যে এটি কোনও ফাংশন বডি, যখন কোনও বস্তুর ধনুর্বন্ধনী বনাম? এবং উত্তরটি হ'ল বন্ধনী। অন্যথায়, এটি প্রত্যাশা করে যে নামটি একটি কোড-ব্লকের জন্য খুব কম ব্যবহৃত বৈশিষ্ট্যটির জন্য একটি লেবেল, তবে আপনি একটি switchবা একটি লুপ লেবেল করতে পারেন , যাতে আপনি break;নামটি দিয়ে সেগুলি বের করতে পারেন । সুতরাং যদি এটি অনুপস্থিত থাকে, আপনার 1
MDX

35

আপনার কেবল স্প্রেড অপারেটর ব্যবহার করা উচিত :

var myMap = new Map([["thing1", 1], ["thing2", 2], ["thing3", 3]]);

var newArr = [...myMap].map(value => value[1] + 1);
console.log(newArr); //[2, 3, 4]

var newArr2 = [for(value of myMap) value = value[1] + 1];
console.log(newArr2); //[2, 3, 4]


মনে হচ্ছে এটি এখনও দরকার Array.from, এফওয়াইআই।
নীজার

4
@neezer আপনি একেবারে, ইতিবাচক নয় হট্টগোল এর polyfill ব্যবহার আদেশ, আপনার পৃষ্ঠায় হট্টগোল-transpiled কোড ব্যবহার করতে উৎপাদনে হবে।
এগুলির

@ নরগার্ড এটি পেয়েছে - আমার কাছে কেবলমাত্র একটি কনফিগারেশন পরিবর্তন দরকার যা আমার প্রয়োজন। সত্যিই একপাশে আরও। :)
নীজার

4
শুধু খেয়াল [...myMap].map(mapFn)করার জন্য, এএ অস্থায়ী অ্যারে তৈরি করতে যাচ্ছে এবং তারপরে এটি বাতিল করুন। Array.fromএটি mapFnতার দ্বিতীয় যুক্তি হিসাবে গ্রহণ করে , এটি ব্যবহার করুন।
লগানফস্মিথ

4
@WZVanG কেন নয় Array.from(myMap.values(), val => val + 1);?
লোগানফস্মিথ

22

শুধু ব্যবহার Array.from(iterable, [mapFn])

var myMap = new Map([["thing1", 1], ["thing2", 2], ["thing3", 3]]);

var newArr = Array.from(myMap.values(), value => value + 1);

এই উত্তরের জন্য ধন্যবাদ, আমি আশা করি এটি উচ্চতর হয়। আমি মানচিত্রের অস্থায়ী অ্যারেতে সর্বদা ছড়িয়ে দেওয়ার প্যাটার্নটি ব্যবহার করি, নির্লিপ্তভাবে অজান্তে maচ্ছিক Array.from()দ্বিতীয় প্যারামিটার হিসাবে একটি ম্যাপিং ফাংশন নিয়েছি।
Andru

এটা খুব সুন্দর। আর Map.values()অ্যারে.ভ্যালু () এর বিপরীতে এটি ব্যবহার করার সময় এটি প্রবাহের সাথেও দুর্দান্ত খেলবে যা এখনও নেই: ফেসপাম:
এরিকোসো

4

আপনি এই ফাংশনটি ব্যবহার করতে পারেন:

function mapMap(map, fn) {
  return new Map(Array.from(map, ([key, value]) => [key, fn(value, key, map)]));
}

ব্যবহার:

var map1 = new Map([["A", 2], ["B", 3], ["C", 4]]);

var map2 = mapMap(map1, v => v * v);

console.log(map1, map2);
/*
Map { A → 2, B → 3, C → 4 }
Map { A → 4, B → 9, C → 16 }
*/

3

ব্যবহার করে Array.fromআমি একটি টাইপস্ক্রিপ্ট ফাংশন লিখেছিলাম যা মানগুলি মানচিত্র করে:

function mapKeys<T, V, U>(m: Map<T, V>, fn: (this: void, v: V) => U): Map<T, U> {
  function transformPair([k, v]: [T, V]): [T, U] {
    return [k, fn(v)]
  }
  return new Map(Array.from(m.entries(), transformPair));
}

const m = new Map([[1, 2], [3, 4]]);
console.log(mapKeys(m, i => i + 1));
// Map { 1 => 3, 3 => 5 }

3

আসলে আপনার Mapসাথে এখনও অ্যারেতে রূপান্তর করার পরে মূল কীগুলির সাথে একটি থাকতে পারে Array.from। কোনও অ্যারে ফিরিয়েই এটি সম্ভব , যেখানে প্রথম আইটেমটি হ'ল keyএবং দ্বিতীয়টি রূপান্তরিত value

const originalMap = new Map([
  ["thing1", 1], ["thing2", 2], ["thing3", 3]
]);

const arrayMap = Array.from(originalMap, ([key, value]) => {
    return [key, value + 1]; // return an array
});

const alteredMap = new Map(arrayMap);

console.log(originalMap); // Map { 'thing1' => 1, 'thing2' => 2, 'thing3' => 3 }
console.log(alteredMap);  // Map { 'thing1' => 2, 'thing2' => 3, 'thing3' => 4 }

যদি আপনি সেই কীটি প্রথম অ্যারে আইটেম হিসাবে ফেরত না পান তবে আপনি Mapকীগুলি আলগা করুন ।


1

আমি মানচিত্র প্রসারিত করতে পছন্দ করি

export class UtilMap extends Map {  
  constructor(...args) { super(args); }  
  public map(supplier) {
      const mapped = new UtilMap();
      this.forEach(((value, key) => mapped.set(key, supplier(value, key)) ));
      return mapped;
  };
}

1

আপনি মানচিত্র পরিবর্তন করতে ম্যাপ.সেট ব্যবহার করে মাইম্যাপ.ফরএচ এবং প্রতিটি লুপে ব্যবহার করতে পারেন।

myMap = new Map([
  ["a", 1],
  ["b", 2],
  ["c", 3]
]);

for (var [key, value] of myMap.entries()) {
  console.log(key + ' = ' + value);
}


myMap.forEach((value, key, map) => {
  map.set(key, value+1)
})

for (var [key, value] of myMap.entries()) {
  console.log(key + ' = ' + value);
}


আমি মনে করি এটি বিন্দু মিস করে। অ্যারে.ম্যাপ কিছুই পরিবর্তন করে না।
অ্যারন


0

আপনি যদি পুরো মানচিত্রটিকে আগেই অ্যারে রূপান্তর করতে না চান এবং / অথবা ডেস্ট্রাকচার কী-মান অ্যারেগুলি ব্যবহার করতে চান তবে আপনি এই নির্বোধ ফাংশনটি ব্যবহার করতে পারেন:

/**
 * Map over an ES6 Map.
 *
 * @param {Map} map
 * @param {Function} cb Callback. Receives two arguments: key, value.
 * @returns {Array}
 */
function mapMap(map, cb) {
  let out = new Array(map.size);
  let i = 0;
  map.forEach((val, key) => {
    out[i++] = cb(key, val);
  });
  return out;
}

let map = new Map([
  ["a", 1],
  ["b", 2],
  ["c", 3]
]);

console.log(
  mapMap(map, (k, v) => `${k}-${v}`).join(', ')
); // a-1, b-2, c-3


0
Map.prototype.map = function(callback) {
  const output = new Map()
  this.forEach((element, key)=>{
    output.set(key, callback(element, key))
  })
  return output
}

const myMap = new Map([["thing1", 1], ["thing2", 2], ["thing3", 3]])
// no longer wishful thinking
const newMap = myMap.map((value, key) => value + 1)
console.info(myMap, newMap)

প্রোটোটাইপগুলি সম্পাদনা এড়ানোর ক্ষেত্রে আপনার ধর্মীয় উত্সাহের উপর নির্ভর করে, তবে, আমি এটি খুঁজে পাই এটি স্বজ্ঞাত রাখতে।


0

আপনি () অ্যারেগুলিতে মানচিত্র তৈরি করতে পারেন তবে মানচিত্রের জন্য এ জাতীয় কোনও অপারেশন নেই। ডাঃ অ্যাক্সেল রাউশমায়ারের সমাধান :

  • মানচিত্রটিকে [কী, মান] জোড়গুলির একটি অ্যারে রূপান্তর করুন।
  • অ্যারে মানচিত্র বা ফিল্টার করুন।
  • ফলাফলটি কোনও মানচিত্রে ফিরে রূপান্তর করুন।

উদাহরণ:

let map0 = new Map([
  [1, "a"],
  [2, "b"],
  [3, "c"]
]);

const map1 = new Map(
  [...map0]
  .map(([k, v]) => [k * 2, '_' + v])
);

ফলে

{2 => '_a', 4 => '_b', 6 => '_c'}

-1

সম্ভবত এইভাবে:

const m = new Map([["a", 1], ["b", 2], ["c", 3]]);
m.map((k, v) => [k, v * 2]); // Map { 'a' => 2, 'b' => 4, 'c' => 6 }

আপনার Mapআগে কেবল বানরের প্যাচ প্রয়োজন :

Map.prototype.map = function(func){
    return new Map(Array.from(this, ([k, v]) => func(k, v)));
}

আমরা এই প্যাচটির একটি সহজ ফর্মটি লিখতে পারতাম:

Map.prototype.map = function(func){
    return new Map(Array.from(this, func));
}

তবে আমরা তখন লিখতে বাধ্য করতাম m.map(([k, v]) => [k, v * 2]); যা আমার কাছে কিছুটা বেদনাদায়ক এবং কুরুচিপূর্ণ বলে মনে হয়।

মানচিত্রের মান

আমরা কেবল মানগুলি মানচিত্র করতে পারি, তবে আমি এটি সমাধানের দিকে যাওয়ার পরামর্শ দিচ্ছি না কারণ এটি খুব নির্দিষ্ট। তবুও এটি করা যায় এবং আমাদের নীচের নীচের API থাকবে:

const m = new Map([["a", 1], ["b", 2], ["c", 3]]);
m.map(v => v * 2); // Map { 'a' => 2, 'b' => 4, 'c' => 6 }

ঠিক এইভাবে প্যাচিংয়ের আগে:

Map.prototype.map = function(func){
    return new Map(Array.from(this, ([k, v]) => [k, func(v)]));
}

আপনার উভয় থাকতে পারে, দ্বিতীয়টির নামকরণ করে mapValuesএটি পরিষ্কার করে দেওয়া যায় যে আপনি সম্ভবত বস্তুটি ম্যাপিং করছেন না এটি সম্ভবত প্রত্যাশিত।

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