কোনও ES6 মানচিত্রের বিষয়টিকে বাছাই করা সম্ভব?


98

কোনও এস es ম্যাপ অবজেক্টের এন্ট্রিগুলি বাছাই করা সম্ভব?

var map = new Map();
map.set('2-1', foo);
map.set('0-1', bar);

ফলাফল স্বরূপ:

map.entries = {
    0: {"2-1", foo },
    1: {"0-1", bar }
}

তাদের কীগুলির উপর ভিত্তি করে এন্ট্রিগুলি বাছাই করা সম্ভব?

map.entries = {
    0: {"0-1", bar },
    1: {"2-1", foo }
}

4
মানচিত্র অন্তর্নিহিতভাবে অর্ডার করা হয় না (কেবলমাত্র পুনরাবৃত্তির সন্নিবেশ ক্রম বাদে, যার জন্য বাছাই এবং তারপরে [পুনরায়] যুক্ত করা দরকার))
ব্যবহারকারী 2864740

4
আপনি যখন মানচিত্রের উপরে পুনরাবৃত্তি করবেন তখন এন্ট্রিগুলি বাছাই করুন (উদাহরণস্বরূপ এটিকে অ্যারেতে পরিণত করুন)
হালসিওন

উত্তর:


140

এমডিএন ডকুমেন্টেশন অনুসারে:

একটি মানচিত্র অবজেক্ট তার উপাদানগুলি সন্নিবেশ ক্রমে পুনরাবৃত্তি করে।

আপনি এটি এইভাবে করতে পারেন:

var map = new Map();
map.set('2-1', "foo");
map.set('0-1', "bar");
map.set('3-1', "baz");

var mapAsc = new Map([...map.entries()].sort());

console.log(mapAsc)

ব্যবহার করে .sort(), মনে রাখবেন যে অ্যারের প্রতিটি অক্ষরের স্ট্রিং রূপান্তর অনুসারে প্রতিটি অক্ষরের ইউনিকোড কোড পয়েন্ট মান অনুসারে বাছাই করা হয়। সুতরাং 2-1, 0-1, 3-1সঠিকভাবে বাছাই করা হবে।


7
আপনি সেই ফাংশনটি ছোট করতে পারেন (ক, খ) স্টাফগুলি: var mapAsc = new Map([...map.entries()].sort((a,b) => a[0] > b[0]));তীর ফাংশন (ল্যাম্বদা) ব্যবহার করে
জিমি চন্দ্র

4
প্রকৃতপক্ষে, এটি বর্ণনামূলকভাবে বর্ণনামূলকভাবে তুলনা 2-1,fooকরে 0-1,barএবং3-1,baz
বার্গি


4
...বিন্দু গুরুত্বপূর্ণ অন্যথায় আপনি একটি MapIterator বাছাই করার চেষ্টা করছেন করছে
muttonUp

4
মানচিত্র কীগুলি যদি সংখ্যা 1e-9হয় তবে 100আপনি সাজানো মানচিত্রে পরে রাখার মতো সংখ্যার সাথে অবৈধ ফলাফল পাবেন results সংখ্যার সাথে কাজ করে এমন কোড:new Map([...map.entries()].sort((e1, e2) => e1[0] - e2[0]))
cdalxndr

58

সংক্ষিপ্ত উত্তর

 new Map([...map].sort((a, b) => 
   // Some sort function comparing keys with a[0] b[0] or values with a[1] b[1]
   // Be sure to return -1 if lower and, if comparing values, return 0 if equal
 ))

উদাহরণস্বরূপ, মান স্ট্রিংগুলির সাথে তুলনা করা, যা সমান হতে পারে, আমরা একটি সারণি ফাংশনটি পাস করি যা অ্যাক্সেস করে [1] এবং এর সমান শর্ত রয়েছে যা 0:

 new Map([...map].sort((a, b) => (a[1] > b[1] && 1) || (a[1] === b[1] ? 0 : -1)))

মূল স্ট্রিংগুলির সাথে তুলনা করা, যা সমান হতে পারে না (অভিন্ন স্ট্রিং কীগুলি একে অপরকে ওভাররাইট করতে পারে), আমরা সমান শর্তটি এড়িয়ে যেতে পারি। যাইহোক, আমাদের এখনও স্পষ্টভাবে ফিরে আসা উচিত -১, কারণ অলসভাবে a[0] > b[0]ভুলভাবে ফিরে আসা মিথ্যা দেয় (0 হিসাবে গণ্য করা হয়, সমান) যখন a[0] < b[0]:

 new Map([...map].sort((a, b) => a[0] > b[0] ? 1 : -1))

উদাহরণ সহ বিস্তারিত

.entries()মধ্যে [...map.entries()](অনেক উত্তর প্রস্তাবিত) সম্ভবত মানচিত্র যদি না জাতীয় ইঞ্জিন অপ্টিমাইজ করে যে দূরে আপনার জন্য একটি অতিরিক্ত পুনরাবৃত্তির যোগ অপ্রয়োজনীয় হয়।

সাধারণ পরীক্ষার ক্ষেত্রে, প্রশ্নটি যা জিজ্ঞাসা করে তা আপনি করতে পারেন:

new Map([...map].sort())

... যা, কী সব স্ট্রিং হয়, squashed এবং কমা দ্বারা যোগদান মত কী-মান স্ট্রিং বাধ্য তুলনা '2-1,foo'এবং '0-1,[object Object]'নতুন সন্নিবেশ অর্ডার দিয়ে ফিরে একটি নতুন মানচিত্র:

দ্রষ্টব্য: আপনি যদি কেবলমাত্র {}এসও এর কনসোল আউটপুট দেখতে পান তবে আপনার আসল ব্রাউজার কনসোলটি দেখুন

const map = new Map([
  ['2-1', 'foo'],
  ['0-1', { bar: 'bar' }],
  ['3-5', () => 'fuz'],
  ['3-2', [ 'baz' ]]
])

console.log(new Map([...map].sort()))

তা যে , এটা জোর খাটানো বা ভালো stringification উপর নির্ভর করা একটি ভাল অনুশীলন নয়। আপনি যেমন চমক পেতে পারেন:

const map = new Map([
  ['2', '3,buh?'],
  ['2,1', 'foo'],
  ['0,1', { bar: 'bar' }],
  ['3,5', () => 'fuz'],
  ['3,2', [ 'baz' ]],
])

// Compares '2,3,buh?' with '2,1,foo'
// Therefore sorts ['2', '3,buh?'] ******AFTER****** ['2,1', 'foo']
console.log('Buh?', new Map([...map].sort()))

// Let's see exactly what each iteration is using as its comparator
for (const iteration of map) {
  console.log(iteration.toString())
}

এর মতো বাগগুলি ডিবাগ করা সত্যিই শক্ত - এটি ঝুঁকিপূর্ণ করবেন না!

আপনি কি বা মান উপর বাছাই করতে চান, এটা দিয়ে স্পষ্টভাবে তাদের অ্যাক্সেস সেরা a[0]এবং b[0]সাজানোর ফাংশন ভালো। মনে রাখবেন আমরা ফেরত পাঠাবেন -1এবং 1সামনে এবং পরে না falseবা 0যেমন কাঁচা সঙ্গে a[0] > b[0]কারণ যে সমান হিসাবে গণ্য হয়:

const map = new Map([
  ['2,1', 'this is overwritten'],
  ['2,1', '0,1'],
  ['0,1', '2,1'],
  ['2,2', '3,5'],
  ['3,5', '2,1'],
  ['2', ',9,9']
])

// For keys, we don't need an equals case, because identical keys overwrite 
const sortStringKeys = (a, b) => a[0] > b[0] ? 1 : -1 

// For values, we do need an equals case
const sortStringValues = (a, b) => (a[1] > b[1] && 1) || (a[1] === b[1] ? 0 : -1)

console.log('By keys:', new Map([...map].sort(sortStringKeys)))
console.log('By values:', new Map([...map].sort(sortStringValues)))


11
কী উত্তর, আমাদের এসও আবিষ্কারের পদ্ধতিগুলি ঠিক করতে হবে। এই ভাল কিছু এখানে হারিয়ে যাওয়া উচিত নয়।
সেরোসেস

30

রূপান্তর Mapএকটি অ্যারের ব্যবহার করে Array.fromসাজানোর অ্যারের রূপান্তর পিছনে Mapযেমন

new Map(
  Array
    .from(eventsByDate)
    .sort((a, b) => {
      // a[0], b[0] is the key of the map
      return a[0] - b[0];
    })
)

4
[...map.values()].sort()আমার পক্ষে কাজ করেনি, তবে Array.from(map.values()).sort()করেছেন
রব জুউরলিংক

4
এটি অ্যারে.ফর্ম ছাড়াই আসলে আমাকে সাহায্য করেছিল, টাইপস্রিপ্ট আমাকে একটি সংকলন ত্রুটি দেয়।
আইসিএস্পার

7

ধারণাটি হ'ল আপনার মানচিত্রের কীগুলি অ্যারেতে বের করা to এই অ্যারে বাছাই করুন। তারপরে এই সাজানো অ্যারেটির উপরে পুনরাবৃত্তি করুন, অরসেট করা মানচিত্র থেকে এর মান জোড়াটি এনে একটি নতুন মানচিত্রে রাখুন। নতুন মানচিত্রটি সাজানো ক্রমে থাকবে। নীচের কোডটি এর বাস্তবায়ন:

var unsortedMap = new Map();
unsortedMap.set('2-1', 'foo');
unsortedMap.set('0-1', 'bar');

// Initialize your keys array
var keys = [];
// Initialize your sorted maps object
var sortedMap = new Map();

// Put keys in Array
unsortedMap.forEach(function callback(value, key, map) {
    keys.push(key);
});

// Sort keys array and go through them to put in and put them in sorted map
keys.sort().map(function(key) {
    sortedMap.set(key, unsortedMap.get(key));
});

// View your sorted map
console.log(sortedMap);

4
নিরবচ্ছিন্ন কীগুলি কেবল ব্যবহার করে নির্ধারণ করা যায় unsortedMap.keys()। এছাড়াও keys.sort().map...হওয়া উচিত keys.sort().forEach...
faintsignal

5

আপনি একটি অ্যারেতে রূপান্তর করতে পারেন এবং এতে অ্যারে সরিং পদ্ধতিগুলিতে কল করতে পারেন:

[...map].sort(/* etc */);

4
এবং কি? আপনি কোনও অ্যারে পাবেন কোনও মানচিত্র বা বস্তু নয়
সবুজ

4
এবং আপনি কীটি হারাবেন
ব্রেক করুন


3

একটি উপায় হ'ল এন্ট্রিগুলি অ্যারে পাওয়া, এটি বাছাই করা এবং তার পরে সাজানো অ্যারে সহ একটি নতুন মানচিত্র তৈরি করা:

let ar = [...myMap.entries()];
sortedArray = ar.sort();
sortedMap = new Map(sortedArray);

তবে আপনি যদি কোনও নতুন অবজেক্ট তৈরি করতে না চান তবে একই জিনিসটিতে কাজ করতে চান তবে আপনি এরকম কিছু করতে পারেন:

// Get an array of the keys and sort them
let keys = [...myMap.keys()];
sortedKeys = keys.sort();

sortedKeys.forEach((key)=>{
  // Delete the element and set it again at the end
  const value = this.get(key);
  this.delete(key);
  this.set(key,value);
})

1

নীচের স্নিপেটটি তার কীগুলি দ্বারা প্রদত্ত মানচিত্রকে সাজিয়ে তোলে এবং কী-মান অবজেক্টের কীগুলি আবার ম্যাপ করে। আমার মানচিত্রটি স্ট্রিং-> স্ট্রিং অবজেক্ট ম্যাপ হওয়ার কারণে আমি লোকালকম্পিয়ার ফাংশনটি ব্যবহার করেছি।

var hash = {'x': 'xx', 't': 'tt', 'y': 'yy'};
Object.keys(hash).sort((a, b) => a.localeCompare(b)).map(function (i) {
            var o = {};
            o[i] = hash[i];
            return o;
        });

ফলাফল: [{t:'tt'}, {x:'xx'}, {y: 'yy'}];


1

আমি যতদূর দেখতে পাচ্ছি বর্তমানে কোনও মানচিত্রকে যথাযথভাবে সাজানো সম্ভব নয়।

অন্যান্য সমাধানগুলিতে যেখানে মানচিত্রটিকে একটি অ্যারেতে রূপান্তরিত করা হয় এবং এইভাবে সাজানো হয় তাতে নিম্নলিখিত বাগ রয়েছে:

var a = new Map([[1, 2], [3,4]])
console.log(a);    // a = Map(2) {1 => 2, 3 => 4}

var b = a;
console.log(b);    // b = Map(2) {1 => 2, 3 => 4}

a = new Map();     // this is when the sorting happens
console.log(a, b); // a = Map(0) {}     b = Map(2) {1 => 2, 3 => 4}

বাছাইয়ের ফলে একটি নতুন অবজেক্ট তৈরি হয় এবং অরসেটেড অবজেক্টের সমস্ত অন্যান্য পয়েন্টার নষ্ট হয়ে যায়।


1

বিশদ পেতে 2 ঘন্টা ব্যয়।

নোট করুন যে প্রশ্নের উত্তর ইতিমধ্যে https://stackoverflow.com/a/31159284/984471 এ দেওয়া হয়েছে

তবে, প্রশ্নটির এমন কী রয়েছে যা সাধারণ নয়, ব্যাখ্যা সহ
একটি স্পষ্ট ও সাধারণ উদাহরণ নীচে যা আরও কিছু স্পষ্টতা সরবরাহ করে:

  • আরও কয়েকটি উদাহরণ এখানে: https://javascript.info/map-set
  • আপনি নীচের লিঙ্কটি নীচের কোডটি কপি-পেস্ট করতে পারেন এবং আপনার নির্দিষ্ট ব্যবহারের ক্ষেত্রে এটি সংশোধন করতে পারেন: https://www.jdoodle.com/execute-nodejs-online/

let m1 = new Map();

m1.set(6,1); // key 6 is number and type is preserved (can be strings too)
m1.set(10,1);
m1.set(100,1);
m1.set(1,1);
console.log(m1);

// "string" sorted (even if keys are numbers) - default behaviour
let m2 = new Map( [...m1].sort() );
//      ...is destructuring into individual elements
//      then [] will catch elements in an array
//      then sort() sorts the array
//      since Map can take array as parameter to its constructor, a new Map is created
console.log('m2', m2);

// number sorted
let m3 = new Map([...m1].sort((a, b) => {
  if (a[0] > b[0]) return 1;
  if (a[0] == b[0]) return 0;
  if (a[0] < b[0]) return -1;
}));
console.log('m3', m3);

// Output
//    Map { 6 => 1, 10 => 1, 100 => 1, 1 => 1 }
// m2 Map { 1 => 1, 10 => 1, 100 => 1, 6 => 1 }
//           Note:  1,10,100,6  sorted as strings, default.
//           Note:  if the keys were string the sort behavior will be same as this
// m3 Map { 1 => 1, 6 => 1, 10 => 1, 100 => 1 }
//           Note:  1,6,10,100  sorted as number, looks correct for number keys

আশা করি এইটি কাজ করবে.


0

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

চিহ্নিত করুন যে আমি এখানে একটি তীর ফাংশনটি ব্যবহার করে ভিতরে বাছাই করা ফাংশনটি সংজ্ঞায়িত করি যা -1 এটির চেয়ে কম হয় এবং 0 টি অন্যথায় জাভাস্ক্রিপ্ট অবজেক্টগুলির একটি প্রোপার্টে সাজানো হয় যাতে আমি এপিআই থেকে পাই।

report.ProcedureCodes.sort((a, b) => a.NumericalOrder < b.NumericalOrder ? -1 : 0).map((item, i) =>
                        <TableRow key={i}>

                            <TableCell>{item.Code}</TableCell>
                            <TableCell>{item.Text}</TableCell>
                            {/* <TableCell>{item.NumericalOrder}</TableCell> */}
                        </TableRow>
                    )

-2
let map = new Map();
map.set('2-1', "foo");
map.set('0-1', "bar");
map.set('3-1', "baz");
let mapAsc = new Map([...map.entries()].sort());
console.log(mapAsc);

// Map(3) {"0-1" => "bar", "2-1" => "foo", "3-1" => "baz"}

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

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