লডাশ: ম্যাপিং অ্যারে অবজেক্ট


92

এটি নিতে কোনও বিল্ট-ইন লোডাশ ফাংশন রয়েছে:

var params = [
    { name: 'foo', input: 'bar' },
    { name: 'baz', input: 'zle' }
];

এবং এটি আউটপুট:

var output = {
    foo: 'bar',
    baz: 'zle'
};

এখনই আমি কেবল ব্যবহার করছি Array.prototype.reduce():

function toHash(array, keyName, valueName) {
    return array.reduce(function(dictionary, next) {
        dictionary[next[keyName]] = next[valueName];
        return dictionary;
    }, {});
}

toHash(params, 'name', 'input');

লড্যাশ শর্ট কাট থাকলে ভাবছেন W

উত্তর:


138

লোডাশের সাথে অন্য উপায় 4.17.2

_.chain(params)
    .keyBy('name')
    .mapValues('input')
    .value();

বা

_.mapValues(_.keyBy(params, 'name'), 'input')

বা সাথে _.reduce

_.reduce(
    params,
    (acc, { name, input }) => ({ ...acc, [name]: input }),
    {}
)

অ্যাক্রিকোস দ্য _.keyByদ্য পুরো অ্যারেটিকে একটি সামগ্রীতে রূপান্তরিত করবে, তবে প্রশ্নটি বেশিরভাগ ক্ষেত্রে অ্যারের প্রতিটি বস্তু থেকে একটি আইটেমকে কী হিসাবে এবং অন্য একটি আইটেমকে এর মান হিসাবে রাখার বিষয়ে। যদি _.keyByব্যবহার করা হয়, তবে সমস্ত মান বস্তু হবে।
মোস্তফা এহসান অলোকোজে

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

55

কোনও অ্যারে সহজেই কোনও বস্তুতে রূপান্তর করতে আপনার _.keyBy ব্যবহার করা উচিত।

এখানে ডক্স

নীচের ব্যবহারের উদাহরণ:

var params = [
    { name: 'foo', input: 'bar' },
    { name: 'baz', input: 'zle' }
];
console.log(_.keyBy(params, 'name'));
<script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.4/lodash.min.js"></script>

প্রয়োজনে _.keyBy বা অবজেক্টটি _.keyBy ব্যবহার করার পরে সঠিক কাঙ্ক্ষিত ফলাফল পাওয়ার জন্য আপনি অ্যারে ব্যবহার করতে পারেন।


4
স্টোসোভালা দ্বারা সর্বাধিক ভোট দেওয়া উত্তর বুঝতে এটির আগে দেখুন Look
রোমান সুসি

4
এটি একটি দুর্দান্ত উত্তর, তবে এটি প্রশ্নের উত্তর দেয় না । মানগুলি স্ট্রিং হওয়া উচিত বস্তু নয়।
ডেম পাইলাফিয়ান

34

হ্যাঁ এটি এখানে , ব্যবহার করে_.reduce

var params = [
    { name: 'foo', input: 'bar' },
    { name: 'baz', input: 'zle' }
];

_.reduce(params , function(obj,param) {
 obj[param.name] = param.input
 return obj;
}, {});

তবুও আবার reduce()ব্যবহারের ক্ষেত্রে কেটে যায়। এটি করার দুর্দান্ত উপায়!
ড্যান

এর টাইপ স্ক্রিপ্ট সংস্করণ কেউ পেয়েছেন?
mr.bjerre

বাস্তবতা এটি গাণিতিকভাবে সত্য যে আপনি হ্রাস / ইনজেকশন ব্যবহার করে আক্ষরিকভাবে কোনও পুনরাবৃত্তির ক্রিয়াটি বাস্তবায়ন করতে পারেন, যেহেতু হ্রাস একটি তালিকার বিপরীতে ph যাইহোক, সেই নমনীয়তাটি পঠনযোগ্যতার দামের সাথে আসে। আপনি _.reduceযা করতে চাইছেন তা নির্ভুলভাবে প্রকাশ না করা পর্যন্ত এটি ব্যবহার করবেন না : এটি অন্য কোনও ক্ষেত্রে কোডের বিষয়টি উল্লেখযোগ্যভাবে অস্পষ্ট করে। আমি ব্যক্তিগতভাবে _.zipObject@ ডিজেচলিনের মাধ্যমে সমাধানটিকে প্রাধান্য দিয়েছি - এটি ব্যর্থ হয়ে, _.keyBy/ _.mapValuesপদ্ধতির।
রবার্ট ফিশার

16

এটি অবজেক্ট.সাইগেনের জন্য একটি কাজের মতো মনে হচ্ছে:

const output = Object.assign({}, ...params.map(p => ({[p.name]: p.input})));

ওপিসের অনুরূপ কোনও ফাংশন হিসাবে মোড়ানোর জন্য সম্পাদিত, এটি হবে:

const toHash = (array, keyName, valueName) => 
    Object.assign({}, ...array.map(o => ({[o[keyName]]: o[valueName]})));

(বেন স্টুয়ার্ডকে ধন্যবাদ, ভাল চিন্তাভাবনা ...)


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

11

আপনি অ্যারে হ্রাস পদ্ধতি এবং ES6 ডিস্ট্রাকচার সহ একটি লাইনার জাভাস্ক্রিপ্ট ব্যবহার করতে পারেন মূল মান জোড়ের অ্যারেটিকে অবজেক্টে রূপান্তর করতে।

arr.reduce((map, { name, input }) => ({ ...map, [name]: input }), {});

4
দুর্ভাগ্যক্রমে, এটি ও (এন ^ 2)।
jimrandomh

10

এটি সম্ভবত আপনি চেয়ে বেশি ভার্বোজ, তবে আপনি কিছুটা জটিল ক্রিয়াকলাপের জন্য জিজ্ঞাসা করছেন যাতে প্রকৃত কোড জড়িত হতে পারে (হরর)।

আমার সুপারিশ, zipObjectএটি বেশ যুক্তিসঙ্গত সহ:

_.zipObject(_.map(params, 'name'), _.map(params, 'input'));

আরও একটি বিকল্প, আরও হ্যাকি ব্যবহার করে fromPairs:

_.fromPairs(_.map(params, function(val) { return [val['name'], val['input']));

বেনামে ফাংশন হ্যাকেনেসিটি দেখায় - আমি বিশ্বাস করি না যে জেএস বস্তুর পুনরাবৃত্তিতে উপাদানগুলির ক্রমের গ্যারান্টি দেয়, তাই কলিং এটি .values()করবে না।


আমি ব্যবহার সম্পর্কে হ্যাকী কিছুই দেখতে পাচ্ছি না fromPairs, এবং কলিং values()সত্যই করবে না। অন্তত পাঠযোগ্যতার দৃষ্টিকোণ থেকে।
এক্স-ইউরি

6

লোডাশের সাথে আর একটি উপায়

জোড়া তৈরি করুন, এবং তারপরে হয় কোনও অবজেক্ট তৈরি করুন বা ES6 Mapসহজেই

_(params).map(v=>[v.name, v.input]).fromPairs().value()

বা

_.fromPairs(params.map(v=>[v.name, v.input]))

এখানে একটি কাজের উদাহরণ


4
এই সমাধানটির ভাল অংশটি হ'ল এটি প্লেইন ইএস-তেও সম্ভব:Object.fromEntries(params.map(v => [v.name, v.input]))
ফ্রেগ্যান্ট

@ ফ্রেগান্টে, ক্রোম 73৩++ কেবল ক্যানিইউজড
d9k

6

এটি এর মতো কোনও লোডাশ ফাংশন ব্যবহার না করেও সমাধান করতে পারে:

let paramsVal = [
    { name: 'foo', input: 'bar' },
    { name: 'baz', input: 'zle' }
];
let output = {};

paramsVal.forEach(({name, input})=>{
  output[name] = input;
})


console.log(output);

এখানে চিত্র বর্ণনা লিখুন

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