লোডাশ দিয়ে অ্যারেতে অবজেক্টটি রূপান্তর করুন


165

কিভাবে আমি একটি বড় রুপান্তর করতে পারেন objectকরতে arraylodash সঙ্গে?

var obj = {
  22: {name:"John", id:22, friends:[5,31,55], works:{books:[], films:[],}
  12: {name:"Ivan", id:12, friends:[2,44,12], works:{books:[], films:[],}
}

// transform to 
var arr = [{name:"John", id:22...},{name:"Ivan", id:12...}]

@ মৃতুঞ্জয় হ্যাঁ কারণ ডক্সের লাইব্রেরির এত দুর্দান্ত সংক্ষিপ্তসার রয়েছে ... না। এটি কেবল ফাংশনগুলির একটি সম্পূর্ণ তালিকা এবং প্রতিটিটির মধ্য দিয়ে যাওয়া যদি সঠিকভাবে না থাকে তবে সময় নষ্টের পক্ষে প্রমাণ করতে পারে। প্রশ্নটি ন্যায্য।
Epirkes

উত্তর:


264

আপনি করতে পারেন

var arr = _.values(obj);

ডকুমেন্টেশন জন্য এখানে দেখুন।


34
কী হিসাবে আপনি সম্পত্তি হিসাবে কী সংরক্ষণ করতে চান? (এই উদাহরণে, যদি idসম্পত্তিটির অস্তিত্ব না থাকে এবং আপনি প্রতিটি বস্তুর কীটির উপর ভিত্তি করে এটি তৈরি করতে চেয়েছিলেন
মাইকেল লিকোরি

8
আপনি এর মতো কিছু করতে পারেন:var arr = _.values(_.mapKeys(obj, function(value, key) { value.id = key; return value; }));
ড্যানিয়েল শ্মিড্ট

1
পছন্দ করেছেন :( সুতরাং আমি যা করেছি তা হ'ল ম্যানুয়ালি returnএইরকম অ্যারেটির দিকে চাপ দিন : const divisionsList = []; _.mapKeys(divisions, (value, key) => { divisionsList[key] = value; });আমি এই পদ্ধতির উন্নতি করতে কোনও মন্তব্য বা পরামর্শের প্রশংসা করব
জনিকিউ

8
@ জোহনিউইউ আমার মনে হয় এর পরিবর্তে আপনাকে মানচিত্রের মানগুলি ব্যবহার করতে হবে যেমনconst toArrayWithKey = (obj, keyAs) => _.values(_.mapValues(obj, (value, key) => { value[keyAs] = key; return value; }));
অরজান

1
@ অর্জান হ্যাঁ আমি আসলে এটি আবিষ্কার করেছি, আপডেট করতে ভুলে গেছি। এটার জন্য ধন্যবাদ.
জননিকিউ

38
_.toArray(obj);

ফলাফলগুলি:

[
  {
    "name": "Ivan",
    "id": 12,
    "friends": [
      2,
      44,
      12
    ],
    "works": {
      "books": [],
      "films": []
    }
  },
  {
    "name": "John",
    "id": 22,
    "friends": [
      5,
      31,
      55
    ],
    "works": {
      "books": [],
      "films": []
    }
  }
]"

1
_.toArray () সূক্ষ্ম @jivings কাজ করে
সৈয়দ

4
শুধুমাত্র মানগুলি পাওয়ার জন্য এটি একটি ভাল বিকল্প, তবে toArrayপ্রয়োজনে কীগুলি সংরক্ষণ করার কোনও উপায় নেই।
কৌশিক চ্যাটার্জি

33

কেউ আগ্রহী হলে একটি আধুনিক নেটিভ সমাধান:

const arr = Object.keys(obj).map(key => ({ key, value: obj[key] }));

বা (আইই নয়):

const arr = Object.entries(obj).map(([key, value]) => ({ key, value }));

2
কেন শুধু নয়Object.keys(obj).map(key=>({key,value: obj[key]}))
কৌশিক চ্যাটার্জি 23'18

1
আমি পছন্দ করি যে এটি ব্যবহারকারীর লড্যাশও না, ভাল কাজ স্যার!
হাংরিপিপো

1
@ ডমিনিক এখন আপনি আপনার সম্পূর্ণ উত্তরটি পরিবর্তন করেছেন এবং আমার মন্তব্য থেকে তা নিয়েছেন, এমনকি কোনও উল্লেখ ছাড়াই (আপনি এটি সম্পাদনা করেছেন)। ভাল করেছেন 👏 😁😁
কৌশিক চ্যাটার্জি

1
@ কুশিক চ্যাটার্জি এটিকে আবার যুক্ত করেছেন
ডমিনিক

2
এটি কি আরও সহায়ক হবে? const arr = Object.keys(obj).map(id => ({ id, ...obj[id] })); এটি কি কোনও প্রত্যাবর্তনিত ডেটাতে পুরো অবজেক্টটি নিয়ে আসবে? ('আইডি' ব্যবহার করে যেহেতু মূল প্রশ্নকর্তা তার চাবিটি আইডি প্রোপ হিসাবে সঞ্চয় করতে চেয়েছিলেন)
জাবায়াত

20

আমার জন্য, এটি কাজ করেছে:

_.map(_.toPairs(data), d => _.fromPairs([d]));

এটা আবর্তন করে

{"a":"b", "c":"d", "e":"f"} 

মধ্যে

[{"a":"b"}, {"c":"d"}, {"e":"f"}]

1
আমার কোনও বস্তুকে একটি অ্যারেতে রূপান্তরিত করা দরকার, এমনভাবে যাতে মূল বস্তুর প্রতিটি কী / মান একটি অ্যারেতে {কী: মান}-অবজেক্ট হয়। _.ToPair (ডেটা) অবজেক্টটি {"a": "b", "c": "d", "e": "f" takes নেয় এবং এটিকে [["a": "এর মতো অ্যারে হিসাবে প্রদর্শন করে বি "], [" সি ":" ডি "], [" ই ":" চ "]]। _.পরিবর্তনগুলি বিপরীতভাবে কাজ করে, এটি 2 টি উপাদান সহ একটি অ্যারে নেয়: ["a", "b"] এবং এটি একটি বস্তু হিসাবে ফেরত দেয়: {"a": "b"}} _.Map- এর সাহায্যে _.toPair দ্বারা অ্যারেগুলি অবজেক্টের অ্যারে রূপান্তর করতে যদি অ্যারে তৈরি করা হয় তবে আমি অ্যারের উপরে পুনরাবৃত্তি করলাম।
NoNine

1
আমি এটি দেখতে খুশি যে আমি স্ক্রোল করে নামলাম। আপনার সমাধান আমার জন্য কাজ করে! ধন্যবাদ!
ওয়াল

@ ননাইন আপনাকে কোনও অ্যারে (অ্যারে) তে মানচিত্র প্রয়োগ করার দরকার নেই, আপনি সরাসরি ইনপুট অবজেক্টে এটি প্রয়োগ করতে পারেন এবং প্রতিটি মূল মান জুটি _.map(data, (v,k)=>({[k]: v}))বিশদে আমার উত্তর দেখুন see _.toPairsএবং _fromPairsএখানে অতিরিক্ত এবং অপ্রয়োজনীয়।
কাউশিক চ্যাটার্জি

এই প্রশ্নটি কি বোঝাতে চাইছে তা নয়। কারণ ফলাফলটি ব্যবহার করা কিছুটা আলাদা কারণ প্রতিটি এন্ট্রিতে একটি কী থাকে (যা আপনি জানেন না) এবং আবার প্রতিটি পৃথক প্রবেশের মান পাওয়ার জন্য আপনাকে কিছু যুক্তি (উদাহরণস্বরূপ অবজেক্ট.কিজ বা অবজেক্ট.ভেলিউজ) অতিক্রম করতে হবে value প্রত্যেকটি, খেলনা কীগুলি সংরক্ষণ করতে চাইলে আপনি এমন বস্তুর একটি অ্যারে তৈরি করতে পারেন যা স্ট্র্টচারডের মতো হয়[{key: 'someKey', val: 'The value'}, {....},...]
চ্যাটার্জি

13

আপনি যে ফলাফলটি পেয়েছেন তার বেশ কয়েকটি উপায় রয়েছে। এগুলি বিভাগগুলিতে ভাঙতে দেয়:

কেবল ES6 মানগুলি :

এর মূল পদ্ধতি হ'ল অবজেক্ট.ভ্যালুগুলি । তবে অবজেক্ট.কিজ এবং অ্যারে.ম্যাপ ব্যবহার করে আপনি প্রত্যাশিত ফলাফলটি পেতে পারেন:

Object.values(obj)
Object.keys(obj).map(k => obj[k])

ES6 কী এবং মান :

মানচিত্র এবং ES6 ব্যবহার গতিশীল / নির্ণিত বৈশিষ্ট্য এবং ডেসট্রাকচারিং আপনি মূল ধরে রাখা এবং মানচিত্র থেকে একটি বস্তু ফিরে আসতে পারেন।

Object.keys(obj).map(k => ({[k]: obj[k]}))
Object.entries(obj).map(([k,v]) => ({[k]:v}))

লড্যাশ মানগুলি :

এর জন্য নকশা করা পদ্ধতিটি _.valuesঅবশ্য "শর্টকাট" এর মতো _.mapএবং ইউটিলিটি পদ্ধতিতে রয়েছে _.toArrayযা কেবলমাত্র অবজেক্ট থেকে মানগুলি সহ একটি অ্যারেও ফিরিয়ে আনবে । আপনি পারা এছাড়াও _.mapযদিও _.keysএবং ব্যবহার করে বস্তু থেকে মান পেতে obj[key]স্বরলিপি।

দ্রষ্টব্য: _.mapপাস করার সময় কোনও অবজেক্ট তার baseMapহ্যান্ডলারটি ব্যবহার করবে যা মূলত forEachঅবজেক্টের বৈশিষ্ট্যগুলিতে on

_.values(obj)
_.map(obj)
_.toArray(obj)
_.map(_.keys(obj), k => obj[k])

লোড্যাশ কী এবং মান :

// Outputs an array with [[KEY, VALUE]]
_.entries(obj)
_.toPairs(obj)

// Outputs array with objects containing the keys and values
_.map(_.entries(obj), ([k,v]) => ({[k]:v}))
_.map(_.keys(obj), k => ({[k]: obj[k]}))
_.transform(obj, (r,c,k) => r.push({[k]:c}), [])
_.reduce(obj, (r,c,k) => (r.push({[k]:c}), r), [])

নোট করুন যে উপরের উদাহরণগুলিতে ES6 ব্যবহৃত হয় (তীর ফাংশন এবং গতিশীল বৈশিষ্ট্য)। _.fromPairsযদি ES6 সমস্যা হয় তবে আপনি কোনও অবজেক্ট রচনা করতে লোডাশ এবং অন্যান্য পদ্ধতি ব্যবহার করতে পারেন ।


12

আপনি চাইলে প্রতিটি অ্যারে আইটেমের সম্পত্তি হিসাবে কী (এই ক্ষেত্রে আইডি) সংরক্ষণ করা হয়

const arr = _(obj) //wrap object so that you can chain lodash methods
            .mapValues((value, id)=>_.merge({}, value, {id})) //attach id to object
            .values() //get the values of the result
            .value() //unwrap array of objects

8

2017 আপডেট: অবজেক্ট.ভ্যালু , লড্যাশ মান এবং টু অ্যারে এটি করুন। এবং কীগুলির মানচিত্র এবং স্প্রেড অপারেটর সংরক্ষণের জন্য দুর্দান্ত খেলুন:

// import { toArray, map } from 'lodash'
const map = _.map

const input = {
  key: {
    value: 'value'
  }
}

const output = map(input, (value, key) => ({
  key,
  ...value
}))

console.log(output)
// >> [{key: 'key', value: 'value'}])
<script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.4/lodash.js"></script>


7

প্লেইন জাভাস্ক্রিপ্টের ( ECMAScript-2016) দিয়ে অ্যারেতে অবজেক্টটিকে রূপান্তর করা হচ্ছেObject.values :

var obj = {
    22: {name:"John", id:22, friends:[5,31,55], works:{books:[], films:[]}},
    12: {name:"Ivan", id:12, friends:[2,44,12], works:{books:[], films:[]}}
}

var values = Object.values(obj)

console.log(values);

আপনি যদি কীগুলি ব্যবহার Object.entriesএবং এটির Array#mapমতো রাখতে চান তবে :

var obj = {
    22: {name:"John", id:22, friends:[5,31,55], works:{books:[], films:[]}},
    12: {name:"Ivan", id:12, friends:[2,44,12], works:{books:[], films:[]}}
}

var values = Object.entries(obj).map(([k, v]) => ({[k]: v}))

console.log(values);


5

var arr = _.map(obj)

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

উদাহরণ:

তবে, আপনি যদি নিজের অবজেক্টটি রূপান্তর করতে চান তবে আপনি কীটি সংরক্ষণ করার প্রয়োজন থাকলেও আপনি এটি করতে পারেন, _.map(obj, (v, k) => {...}অতিরিক্ত যুক্তি দিয়ে আপনি এটি ( ) করতে পারেন mapএবং তারপরে আপনি কীভাবে চান তা ব্যবহার করতে পারেন।

তবে এর অন্যান্য ভ্যানিলা জেএস সমাধান রয়েছে (প্রতিটি lodashসমাধান হিসাবে এর খাঁটি জেএস সংস্করণ থাকা উচিত) যেমন:

  • Object.keysএবং তারপরে mapতাদের মানগুলিতে to
  • Object.values (ES-2017 এ)
  • Object.entriesএবং তারপরে mapপ্রতিটি কী / মান জোড়া (ইএস -2017 এ)
  • for...in লুপটি আনুন এবং মানগুলি আনার জন্য প্রতিটি কী ব্যবহার করুন

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

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


2
খুব সুন্দর এবং খুব সংক্ষিপ্ত।
এডেনকর্বিন

5

অ্যারে আপত্তি

সমস্ত উত্তরগুলির মধ্যে আমি মনে করি এটি সেরা one

let arr = Object.entries(obj).map(([key, val]) => ({ key, ...val }))

যে রূপান্তর:

{
  a: { p: 1, q: 2},
  b: { p: 3, q: 4}
}

প্রতি:

[
  { key: 'a', p: 1, q: 2 }, 
  { key: 'b', p: 3, q: 4 }
]

অ্যারে টু অবজেক্ট

ফিরে রূপান্তর করতে:

let obj = arr.reduce((obj, { key, ...val }) => { obj[key] = { ...val }; return obj; }, {})

মূল্যে কীটি রেখে পিছনে রূপান্তর করতে:

let obj = arr.reduce((obj, { key, ...val }) => { obj[key] = { key, ...val }; return obj; }, {})

দিতে হবে:

{
  a: { key: 'a', p: 1, q: 2 },
  b: { key: 'b', p: 3, q: 4 }
}

শেষ উদাহরণের জন্য আপনি লোডাশ _.keyBy(arr, 'key')বা ব্যবহার করতে পারেন _.keyBy(arr, i => i.key)


3

আপনি যদি কোনও অ্যারেতে অবজেক্টের কিছু কাস্টম ম্যাপিং (যেমন মূল অ্যারে.প্রোটোটাইপ.ম্যাপ) চান তবে আপনি কেবল ব্যবহার করতে পারেন _.forEach:

let myObject = {
  key1: "value1",
  key2: "value2",
  // ...
};

let myNewArray = [];

_.forEach(myObject, (value, key) => {
  myNewArray.push({
    someNewKey: key,
    someNewValue: value.toUpperCase() // just an example of new value based on original value
  });
});

// myNewArray => [{ someNewKey: key1, someNewValue: 'VALUE1' }, ... ];

lodash_.ForEach https://lodash.com/docs/#forEach এর ডক দেখুন

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