লোডাশ .গ্রুপবি ব্যবহার করে। গ্রুপযুক্ত আউটপুট জন্য আপনার নিজস্ব কী যুক্ত করবেন?


104

আমি এই নমুনা ডেটা একটি এপিআই থেকে ফিরে এসেছি।

আমি লড্যাশ ব্যবহার করছি ডেটাটিকে _.groupByকোনও বস্তুতে রূপান্তর করতে আমি আরও ভালভাবে ব্যবহার করতে পারি। ফিরে আসা কাঁচা তথ্য হ'ল:

[
    {
        "name": "jim",
        "color": "blue",
        "age": "22"
    },
    {
        "name": "Sam",
        "color": "blue",
        "age": "33"
    },
    {
        "name": "eddie",
        "color": "green",
        "age": "77"
    }
]

আমি চাই _.groupByফাংশনটি এমন কোনও বস্তুর প্রত্যাবর্তন করবে:

[
    {
        color: "blue",
        users: [
            {
                "name": "jim",
                "color": "blue",
                "age": "22"
            },
            {
                "name": "Sam",
                "color": "blue",
                "age": "33"
            }
        ]
    },
    {
        color: "green",
        users: [
            {
                "name": "eddie",
                "color": "green",
                "age": "77"
            }
        ]
    }
]

বর্তমানে আমি ব্যবহার করছি

_.groupBy(a, function(b) { return b.color})

যা এটি ফিরিয়ে দিচ্ছে

{blue: [{..}], green: [{...}]}

সম্পর্কিত সঠিক, কিন্তু আমি সত্যিই (চাবি আমি চাই যোগ করতে চান color, users)। এটি কি ব্যবহার সম্ভব _.groupBy? বা অন্য কোন LoDashইউটিলিটি?

উত্তর:


140

আপনি লোডাশ ৪.x এ এটি করতে পারেন

var data = [{
  "name": "jim",
  "color": "blue",
  "age": "22"
}, {
  "name": "Sam",
  "color": "blue",
  "age": "33"
}, {
  "name": "eddie",
  "color": "green",
  "age": "77"
}];

console.log(
  _.chain(data)
    // Group the elements of Array based on `color` property
    .groupBy("color")
    // `key` is group's name (color), `value` is the array of objects
    .map((value, key) => ({ color: key, users: value }))
    .value()
);
<script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.15/lodash.min.js"></script>


আসল উত্তর

var result = _.chain(data)
    .groupBy("color")
    .pairs()
    .map(function(currentItem) {
        return _.object(_.zip(["color", "users"], currentItem));
    })
    .value();
console.log(result);

অনলাইন ডেমো

দ্রষ্টব্য: লোডাশ ৪.০ এর পরে, .pairsফাংশনটির নতুন নামকরণ করা হয়েছে_.toPairs()


খুব নিফটি, তবে আমার মাথাটা গুটিয়ে রাখা শক্ত hard আপনি কি মধ্যবর্তী পদক্ষেপগুলি, বিশেষত জুটিবদ্ধকরণ এবং জিপিং (এবং ডাবল জিপ, যেহেতু _.objectএকটি উপাধি হিসাবে _.zipObject) ব্যাখ্যা করতে পারেন।
বেনি বোত্তেমা

3
লড্যাশ 3.10.0 এবং প্রতিটি পদক্ষেপের জন্য কিছু লগিং: jsfiddle.net/plantface/WYCF8/171 । এটি এখনও ধাঁধা, তবে আমি সেখানে পৌঁছে যাচ্ছি। ব্যবহৃত হয়নি _.zipএবং _.pairএখনও অনেক কিছু।
বেনি বোত্তেমা

12
লোডাস ৪.x এ, pairs()পদ্ধতিটির আর অস্তিত্ব নেই। এই উদাহরণের একটি আপডেট লোডাস 4.0 সংস্করণটি হ'ল:.chain(data).groupBy('color') .toPairs().map(function (pair) { return _.zipObject(['Name', 'Suppliers'], air); }).value();
এরিক শিয়েরবুম

5
আমি মনে করি লোড্যাশের একটি ফাংশন থাকা উচিত যা এটি খুব সঠিক জিনিসটি করে। আমি মনে করি ব্যবহারকারীরা সার্বক্ষণিক কোনও সম্পত্তির দ্বারা অবজেক্টগুলির একটি অ্যারে গ্রুপ করতে চান।
অ্যাডাম ক্লেইন

1
ব্যবহার _.chainকরা এখন একটি খারাপ অভ্যাস হিসাবে বিবেচিত হয়।
পাভেল

88

এটা কি সহজ না?

var result = _(data)
            .groupBy(x => x.color)
            .map((value, key) => ({color: key, users: value}))
            .value();

4
এটি আমার কাছে আরও পরিচ্ছন্ন বলে মনে হয় এবং একই ফলাফল ফিরে আসবে বলে মনে হয়। ধন্যবাদ!
জেরেমি এ ওয়েস্ট

3
কি দারুন. এটা কি সিনট্যাক্স? প্রথমবার দেখেছি যে আপনি
কন্ট্রাক্টরে

এটি গ্রহণযোগ্য উত্তর হওয়া উচিত। সহজ এবং পরিষ্কার।
টিয়াগো স্টেপহেনস্ট মার্টিনস


17

সর্বাধিক ভোট দেওয়া উত্তর লোডাশ _.chainফাংশন ব্যবহার করে যা এখন একটি খারাপ অনুশীলন হিসাবে বিবেচিত হয় "কেন ব্যবহার _.chainকরা ভুল হয় is"

কার্যনির্বাহী প্রোগ্রামিং দৃষ্টিকোণ থেকে সমস্যাটির কাছে আসা এমন কয়েকজন এখানে রয়েছে :

import tap from "lodash/fp/tap";
import flow from "lodash/fp/flow";
import groupBy from "lodash/fp/groupBy";

const map = require('lodash/fp/map').convert({ 'cap': false });

const result = flow(
      groupBy('color'),
      map((users, color) => ({color, users})),
      tap(console.log)
    )(input)

inputএমন কোনও অ্যারে যেখানে আপনি রূপান্তর করতে চান।


আমি এখানে flow()পরিবর্তে ব্যবহার করার চেষ্টা করেছি chain(), তবে টাইপস্ক্রিপ্টের টাইপ চেকিংটি কেবল রচিত ফাংশনগুলির সাথে উন্মাদ হয়ে যায়। আমি আশা করি বর্তমানে আমাদের একই স্তরের সমর্থন রয়েছে যা আমরা বর্তমানে আরএক্সজেএসে পাই pipe(), উদাহরণস্বরূপ, লোডাশে।
ব্রুনোজেসিএম

আমি আপনার মানচিত্র () সিনট্যাক্সটি পছন্দ করি, map((users, color) => ({color, users}))পরিবর্তে খুব শীতলmap((value, key) => ({ color: key, users: value }))
গিল এপশেটেন

7

ধন্যবাদ @ থেফোর্তে , আপনার কোডটি ব্যাপক সাহায্য করেছে। আমি লোড্যাশের 4.5.0 সংস্করণ ব্যবহার করে আপনার সমাধান থেকে একটি জেনেরিক ফাংশন তৈরি করেছি।

function groupBy(dataToGroupOn, fieldNameToGroupOn, fieldNameForGroupName, fieldNameForChildren) {
            var result = _.chain(dataToGroupOn)
             .groupBy(fieldNameToGroupOn)
             .toPairs()
             .map(function (currentItem) {
                 return _.zipObject([fieldNameForGroupName, fieldNameForChildren], currentItem);
             })
             .value();
            return result;
        }

এটি ব্যবহার করতে:

var result = groupBy(data, 'color', 'colorId', 'users');

এখানে আপডেটেড ফিডলার রয়েছে;

https://jsfiddle.net/sc2L9dby/


5

লড্যাশ 4 এবং ইএস 6 ব্যবহার করে এখানে একটি আপডেট সংস্করণ দেওয়া আছে

const result = _.chain(data)
    .groupBy("color")
    .toPairs()
    .map(pair => _.zipObject(['color', 'users'], pair))
    .value();

2

আমি আমার নিজস্ব লাইব্রেরিটি ব্যবহার করে কিছু লাইনে আপনি এটি করতে পারেন: আমি একটি ভিন্ন পদ্ধতির পরামর্শ দেব :

var groupMe = sequence(
  groupBy(pluck('color')),
  forOwn(function(acc, k, v) {
    acc.push({colors: k, users: v});
    return acc;
  },[])
);

var result = groupMe(collection);

লোডাশ বা ইন্ডসকোরের ক্ষেত্রে এটি কিছুটা জটিল হবে কারণ তর্কগুলি বিপরীত ক্রমে রয়েছে, সুতরাং আপনাকে _.partialপ্রচুর পরিমাণে ব্যবহার করতে হবে ।


2

গোষ্ঠী দ্বারা উদাহরণ এবং লোড্যাশ ৪.১17.৪ ব্যবহার করে একটি কলামের যোগফল

   var data = [{
                "name": "jim",
                "color": "blue",
                "amount": 22
                }, {
                "name": "Sam",
                "color": "blue",
                "amount": 33
                }, {
               "name": "eddie",
               "color": "green",
               "amount": 77
              }];

      var result = _(data)
                   .groupBy(x => x.color)
                   .map((value, key) => 
                   ({color: key,
                    totalamount: _.sumBy(value,'amount'),
                    users: value})).value();

                    console.log(result);

সুন্দর ... এবং টু ডেট
পিটার ভ্যান ডের লেলি

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