অবজেক্টের অ্যারেরকে হ্যাশ ম্যাপে রূপান্তর করুন, অবজেক্টের একটি অ্যাট্রিবিউট মান দ্বারা সূচিত


305

ব্যবহারের ক্ষেত্রে

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

কোড

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

function isFunction(func) {
    return Object.prototype.toString.call(func) === '[object Function]';
}

/**
 * This function converts an array to hash map
 * @param {String | function} key describes the key to be evaluated in each object to use as key for hashmap
 * @returns Object
 * @Example 
 *      [{id:123, name:'naveen'}, {id:345, name:"kumar"}].toHashMap("id")
 *      Returns :- Object {123: Object, 345: Object}
 *
 *      [{id:123, name:'naveen'}, {id:345, name:"kumar"}].toHashMap(function(obj){return obj.id+1})
 *      Returns :- Object {124: Object, 346: Object}
 */
Array.prototype.toHashMap = function(key) {
    var _hashMap = {}, getKey = isFunction(key)?key: function(_obj){return _obj[key];};
    this.forEach(function (obj){
        _hashMap[getKey(obj)] = obj;
    });
    return _hashMap;
};

আপনি এখানে সংক্ষিপ্তসারটি খুঁজে পেতে পারেন: অবজেক্টের অ্যারেটিকে হ্যাশম্যাপে রূপান্তর করে


আপনি অবজেক্টের পরিবর্তে জাভাস্ক্রিপ্ট মানচিত্র ব্যবহার করতে পারেন। পরীক্ষা করে দেখুন stackoverflow.com/a/54246603/5042169
Jun711

উত্তর:


471

এই মোটামুটি সঙ্গে কাজ করতে তুচ্ছ হয় Array.prototype.reduce:

var arr = [
    { key: 'foo', val: 'bar' },
    { key: 'hello', val: 'world' }
];

var result = arr.reduce(function(map, obj) {
    map[obj.key] = obj.val;
    return map;
}, {});

console.log(result);
// { foo:'bar', hello:'world' }

দ্রষ্টব্য: Array.prototype.reduce() আই 9 9, সুতরাং আপনার যদি পুরানো ব্রাউজারগুলি সমর্থন করতে হয় তবে আপনাকে এটি পলিফিল করতে হবে।


47
result = arr.reduce((map, obj) => (map[obj.key] = obj.val, map), {});ES6 ওয়ান-লাইন অনুরাগীদের জন্য: ডি
টিওডর সানডু

31
@Mtz জন্য ES6 এক লাইন ভক্ত, নিচের mateuscb প্রতিক্রিয়া অনেক ছোট এবং ক্লিনার হল: result = new Map(arr.map(obj => [obj.key, obj.val]));। সর্বাধিক গুরুত্বপূর্ণ, এটি এটিকে স্পষ্ট করে তোলে যে কোনও মানচিত্র ফেরত যাচ্ছে।
রায়ান শিলিংটন

2
@ রায়ানশিলিংটন আমরা এখানে একটি উত্তরের প্রসঙ্গে Array.prototype.reduceরয়েছি , যা জারমার 7777 দ্বারা প্রস্তাবিত। Mapআসলেই খাটো তবে এটি আলাদা জিনিস। আমি মূল অভিপ্রায় অনুসারে রাখছিলাম। মনে রাখবেন এটি কোনও ফোরাম নয়, আপনি এসও কিউ / এ কাঠামো সম্পর্কে আরও পড়তে চাইতে পারেন।
টিওডোর সানডু

2
@ এমটিজ ফেয়ার যথেষ্ট।
রায়ান শিলিংটন

1
আইএমএইচও, এর জন্য যা চাওয়া হয়েছিল তা নয়। অ্যারে দেখানো জন্য সঠিক ফলও হতে হবে: { "foo": {key: 'foo', val: 'bar'}, "hello": {key: 'hello', val: 'world'} }। নোট করুন যে প্রতিটি আসল উপাদানটিকে পুরোপুরি রাখা উচিত । অথবা প্রশ্ন ডেটা ব্যবহার করছে: {"345": {id:345, name:"kumar"}, ...}। ফিক্স: কোডটি পরিবর্তন করুনmap[obj.key] = obj;
টুলমেকারস্টেভ

302

ES6 মানচিত্র ব্যবহার করে ( বেশ ভাল সমর্থিত ), আপনি এটি চেষ্টা করতে পারেন:

var arr = [
    { key: 'foo', val: 'bar' },
    { key: 'hello', val: 'world' }
];

var result = new Map(arr.map(i => [i.key, i.val]));

// When using TypeScript, need to specify type:
// var result = arr.map((i): [string, string] => [i.key, i.val])

// Unfortunately maps don't stringify well.  This is the contents in array form.
console.log("Result is: " + JSON.stringify([...result])); 
// Map {"foo" => "bar", "hello" => "world"}


4
এগুলিও গুরুত্বপূর্ণ যে আপনার কিছু থেকে বেরিয়ে আসার জন্য Mapআপনাকে ন্যায়বিচারের result.get(keyName)বিপরীতে ব্যবহার করা উচিত result[keyName]। এছাড়াও নোট করুন যে কোনও অবজেক্ট কী হিসাবে ব্যবহার করা যেতে পারে কেবল একটি স্ট্রিং নয়।
সাইমন_উইভার

5
আর একটি টাইপস্ক্রিপ্ট সংস্করণ এর মত দেখতে লাগবে: var result = new Map(arr.map(i => [i.key, i.val] as [string, string]));যা কারওর পক্ষে বুঝতে সহজতর হতে পারে। নোটের as [string, string]ধরণের কাস্ট যোগ করা হয়েছে।
অ্যালেক্সভি

আমি যখন ক্রোম ভি 71 এ এই কোডটি চালাচ্ছি, তখনও আমি একটি অ্যারে পাচ্ছি:Result is: [["foo","bar"],["hello","world"]]
জিন-

পিপি resultকোনও হ্যাশ নয় যেমন ওপি দ্বারা অনুরোধ করা হয়েছে।
জিন-ফ্রান্সোইস বিউচাম্প

1
আর একটি টাইপ স্ক্রিপ্ট সংস্করণ:var result = new Map<string, string>(arr.map(i => [i.key, i.val]));
আজিজ জাভেদ

39

সঙ্গে lodash , এই ব্যবহার করা যেতে পারে keyBy :

var arr = [
    { key: 'foo', val: 'bar' },
    { key: 'hello', val: 'world' }
];

var result = _.keyBy(arr, o => o.key);

console.log(result);
// Object {foo: Object, hello: Object}

এটি হ্যাশম্যাপ নয়
পম্মে দে টেরে

37

ES6 স্প্রেড + অবজেক্ট.সেসাইন ব্যবহার করে:

array = [{key: 'a', value: 'b', redundant: 'aaa'}, {key: 'x', value: 'y', redundant: 'zzz'}]

const hash = Object.assign({}, ...array.map(s => ({[s.key]: s.value})));

console.log(hash) // {a: b, x: y}

2
নিখুঁত, ঠিক আমার যা প্রয়োজন;)
পিয়েরে

1
const hash = Object.assign({}, ...(<{}>array.map(s => ({[s.key]: s.value}))));টাইপস্ক্রিপ্ট নিয়ে কাজ করার জন্য এই পরিবর্তনটি করতে হয়েছিল।
রুয়ান800

24

স্প্রেড অপারেটর ব্যবহার:

const result = arr.reduce(
    (accumulator, target) => ({ ...accumulator, [target.key]: target.val }),
    {});

জেএসফিডেলে কোড স্নিপেটের প্রদর্শন ।


7
আমি ঠিক এখানে কারণ! কীভাবে স্প্রেড অপারেটর পুনরায় নিয়মিত পুরানো উপায়ে নতুন কী বরাদ্দ করে এবং সঞ্চালককে ফেরত দেয়? যেহেতু এটি প্রতিবার একটি নতুন অনুলিপি তৈরি করছে, তারপরে স্প্রেডটি খারাপভাবে সম্পাদন করবে !
এএমটুরকি

1
এখন আপনি প্রতিটি পুনরাবৃত্তিতে ছড়িয়ে পড়ে। এটি হ্রাসকারককে পরিবর্তন করতে নিরাপদ হওয়া উচিত। `` `কনট রেজাল্ট = এরিড্রেডস ((সঞ্চালক, টার্গেট) => {আহ্বায়ক [টার্গেট.কি]: টার্গেট.ভাল; রিটার্ন অ্যাকসুলেটর}, {}); `` `
এমটিজে

17

আপনি কেবল একটি জাভাস্ক্রিপ্ট অবজেক্টের পরিবর্তে অ্যারে.প্রোটোটাইপ.ড্রেস () এবং প্রকৃত জাভাস্ক্রিপ্ট মানচিত্র ব্যবহার করতে পারেন ।

let keyValueObjArray = [
  { key: 'key1', val: 'val1' },
  { key: 'key2', val: 'val2' },
  { key: 'key3', val: 'val3' }
];

let keyValueMap = keyValueObjArray.reduce((mapAccumulator, obj) => {
  // either one of the following syntax works
  // mapAccumulator[obj.key] = obj.val;
  mapAccumulator.set(obj.key, obj.val);

  return mapAccumulator;
}, new Map());

console.log(keyValueMap);
console.log(keyValueMap.size);

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

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

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

1
আপনি একটি তীর অনুপস্থিত। পরিবর্তন (mapAccumulator, obj) {...}জন্য(mapAccumulator, obj) => {...}
mayid

15

আপনি নতুন Object.fromEntries()পদ্ধতিটি ব্যবহার করতে পারেন ।

উদাহরণ:

const array = [
   {key: 'a', value: 'b', redundant: 'aaa'},
   {key: 'x', value: 'y', redundant: 'zzz'}
]

const hash = Object.fromEntries(
   array.map(e => [e.key, e.value])
)

console.log(hash) // {a: b, x: y}


12

es2015 সংস্করণ:

const myMap = new Map(objArray.map(obj => [ obj.key, obj.val ]));

4

আমি টাইপস্ক্রিপ্টে যা করছি তা আমার কাছে একটি ছোট্ট ইউটিস লাইব্রেরি রয়েছে যেখানে আমি এই জাতীয় জিনিস রাখি

export const arrayToHash = (array: any[], id: string = 'id') => 
         array.reduce((obj, item) =>  (obj[item[id]] = item , obj), {})

ব্যবহার:

const hash = arrayToHash([{id:1,data:'data'},{id:2,data:'data'}])

অথবা আপনার যদি 'আইডি' ব্যতীত অন্য কোনও শনাক্তকারী থাকে

const hash = arrayToHash([{key:1,data:'data'},{key:2,data:'data'}], 'key')

আপনি যদি কোনও বস্তুটিকে কী হিসাবে ব্যবহার করতে চান তবে আপনাকে অবজেক্টের পরিবর্তে মানচিত্রটি ব্যবহার করতে হবে কারণ
টাইপস্ক্রিপ্ট

3

এটি করার আরও ভাল উপায় রয়েছে অন্যান্য পোস্টার দ্বারা ব্যাখ্যা হিসাবে। তবে আমি যদি খাঁটি জেএস এবং ওল 'র পদ্ধতিতে লেগে থাকতে চাই তবে এটি এখানে:

var arr = [
    { key: 'foo', val: 'bar' },
    { key: 'hello', val: 'world' },
    { key: 'hello', val: 'universe' }
];

var map = {};
for (var i = 0; i < arr.length; i++) {
    var key = arr[i].key;
    var value = arr[i].val;

    if (key in map) {
        map[key].push(value);
    } else {
        map[key] = [value];
    }
}

console.log(map);

এই পদ্ধতির চেয়ে কমাতে পদ্ধতি ব্যবহার করার পরামর্শ দেওয়া হচ্ছে? আমার এই পদ্ধতিটি ব্যবহার করার মতো মনে হচ্ছে। এটি সহজ এবং সবকিছু দেখতে সহজ।
সন্তোষ ইয়েদিদি

আমি এই পদ্ধতিকে ভালবাসি। আমি মনে করি কখনও কখনও সহজ কোডটি সেরা। লোকেরা আজকাল পরিবর্তনের দ্বারা বন্ধ হয়ে যায়, তবে যতক্ষণ না এটি থাকে ততক্ষণ পরিবর্তিততা আসলে বেশ দুর্দান্ত এবং পারফর্মেন্ট।
লুইস এসিটুনো

3

আপনি যদি নতুন ES6 মানচিত্রে রূপান্তর করতে চান তবে এটি করুন:

var kvArray = [['key1', 'value1'], ['key2', 'value2']];
var myMap = new Map(kvArray);

আপনি কেন এই ধরণের মানচিত্র ব্যবহার করবেন? ভাল যে আপনার উপর নির্ভর করে। এই একবার দেখুন ।


2

সহজ জাভাস্ক্রিপ্ট ব্যবহার করে

var createMapFromList = function(objectList, property) {
    var objMap = {};
    objectList.forEach(function(obj) {
      objMap[obj[property]] = obj;
    });
    return objMap;
  };
// objectList - the array  ;  property - property as the key

3
আপনি যেমন এতে কোনও কিছু না ফেরান বলে এই উদাহরণটিতে .map (...) অর্থহীন ব্যবহার করছেন না? আমি এক্ষেত্রে প্রত্যেকের জন্য পরামর্শ দেব।
চুডলিচেক

2

সাথে lodash:

const items = [
    { key: 'foo', value: 'bar' },
    { key: 'hello', value: 'world' }
];

const map = _.fromPairs(items.map(item => [item.key, item.value]));

console.log(map); // { foo: 'bar', hello: 'world' }

1

ব্যবহারের ক্ষেত্রে একটি ছোট উন্নতি reduce:

var arr = [
    { key: 'foo', val: 'bar' },
    { key: 'hello', val: 'world' }
];

var result = arr.reduce((map, obj) => ({
    ...map,
    [obj.key] = obj.val
}), {});

console.log(result);
// { foo: 'bar', hello: 'world' }

এটি অন্য উত্তর চেয়ে দ্রুত ?
ওরাড

@orad সম্ভবত এটি সঞ্চালক হিসাবে ছড়িয়ে পড়ে এবং প্রতিটি পুনরাবৃত্তিকে নতুন অবজেক্ট তৈরি করে।
ভাগ্যবানী

1

চেষ্টা

let toHashMap = (a,f) => a.reduce((a,c)=> (a[f(c)]=c,a),{});


0

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

function isFunction(func){
    return Object.prototype.toString.call(func) === '[object Function]';
}

/**
 * This function converts an array to hash map
 * @param {String | function} key describes the key to be evaluated in each object to use as key for hasmap
 * @returns Object
 * @Example 
 *      [{id:123, name:'naveen'}, {id:345, name:"kumar"}].toHashMap("id")
        Returns :- Object {123: Object, 345: Object}

        [{id:123, name:'naveen'}, {id:345, name:"kumar"}].toHashMap(function(obj){return obj.id+1})
        Returns :- Object {124: Object, 346: Object}
 */
Array.prototype.toHashMap = function(key){
    var _hashMap = {}, getKey = isFunction(key)?key: function(_obj){return _obj[key];};
    this.forEach(function (obj){
        _hashMap[getKey(obj)] = obj;
    });
    return _hashMap;
};

আপনি এখানে সংক্ষিপ্তসারটি দেখতে পারেন: https://gist.github.com/naveen-ithappu/c7cd5026f6002131c1fa


11
দয়া করে, দয়া করে, বাড়ানোর প্রস্তাব দিবেন না Array.prototype!
jmar777

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