লিঙ্কের উত্তরটি আকর্ষণীয় হলেও এটি বেশ ভারী ওজনযুক্ত। আমার দৃষ্টিভঙ্গি কিছুটা আলাদা:
var DataGrouper = (function() {
var has = function(obj, target) {
return _.any(obj, function(value) {
return _.isEqual(value, target);
});
};
var keys = function(data, names) {
return _.reduce(data, function(memo, item) {
var key = _.pick(item, names);
if (!has(memo, key)) {
memo.push(key);
}
return memo;
}, []);
};
var group = function(data, names) {
var stems = keys(data, names);
return _.map(stems, function(stem) {
return {
key: stem,
vals:_.map(_.where(data, stem), function(item) {
return _.omit(item, names);
})
};
});
};
group.register = function(name, converter) {
return group[name] = function(data, names) {
return _.map(group(data, names), converter);
};
};
return group;
}());
DataGrouper.register("sum", function(item) {
return _.extend({}, item.key, {Value: _.reduce(item.vals, function(memo, node) {
return memo + Number(node.Value);
}, 0)});
});
আপনি এটি জেএসবিনে কর্মে দেখতে পাচ্ছেন ।
আমি অ্যান্ডস্কোরে এমন কিছু দেখিনি যা যা করে তা has
করে, যদিও আমার এটি অনুপস্থিত হতে পারে। এটি অনেকটা একই _.contains
, তবে তুলনার _.isEqual
চেয়ে বরং ব্যবহার করে ===
। এগুলি ব্যতীত, বাকিগুলি সমস্যা-নির্দিষ্ট, যদিও জেনেরিক হওয়ার চেষ্টা সহ attempt
এখন DataGrouper.sum(data, ["Phase"])
ফিরে
[
{Phase: "Phase 1", Value: 50},
{Phase: "Phase 2", Value: 130}
]
এবং DataGrouper.sum(data, ["Phase", "Step"])
ফিরে
[
{Phase: "Phase 1", Step: "Step 1", Value: 15},
{Phase: "Phase 1", Step: "Step 2", Value: 35},
{Phase: "Phase 2", Step: "Step 1", Value: 55},
{Phase: "Phase 2", Step: "Step 2", Value: 75}
]
তবে sum
এখানে কেবল একটি সম্ভাব্য ফাংশন। আপনি নিজের পছন্দ মতো অন্যকে নিবন্ধন করতে পারেন:
DataGrouper.register("max", function(item) {
return _.extend({}, item.key, {Max: _.reduce(item.vals, function(memo, node) {
return Math.max(memo, Number(node.Value));
}, Number.NEGATIVE_INFINITY)});
});
এবং এখন DataGrouper.max(data, ["Phase", "Step"])
ফিরে আসবে
[
{Phase: "Phase 1", Step: "Step 1", Max: 10},
{Phase: "Phase 1", Step: "Step 2", Max: 20},
{Phase: "Phase 2", Step: "Step 1", Max: 30},
{Phase: "Phase 2", Step: "Step 2", Max: 40}
]
অথবা আপনি এটি নিবন্ধিত হলে:
DataGrouper.register("tasks", function(item) {
return _.extend({}, item.key, {Tasks: _.map(item.vals, function(item) {
return item.Task + " (" + item.Value + ")";
}).join(", ")});
});
তাহলে কলিং DataGrouper.tasks(data, ["Phase", "Step"])
আপনাকে পেয়ে যাবে
[
{Phase: "Phase 1", Step: "Step 1", Tasks: "Task 1 (5), Task 2 (10)"},
{Phase: "Phase 1", Step: "Step 2", Tasks: "Task 1 (15), Task 2 (20)"},
{Phase: "Phase 2", Step: "Step 1", Tasks: "Task 1 (25), Task 2 (30)"},
{Phase: "Phase 2", Step: "Step 2", Tasks: "Task 1 (35), Task 2 (40)"}
]
DataGrouper
নিজেই একটি ফাংশন। আপনি এটিকে আপনার ডেটা এবং যে গোষ্ঠীগুলির দ্বারা গ্রুপ করতে চান তার একটি তালিকা দিয়ে কল করতে পারেন। এটি এমন একটি অ্যারে প্রদান করে যার উপাদানগুলি দুটি বৈশিষ্ট্য সহ বস্তুযুক্ত: key
গ্রুপযুক্ত বৈশিষ্ট্যগুলির সংগ্রহ, vals
কীতে নেই এমন অবশিষ্ট বৈশিষ্ট্যযুক্ত বস্তুর একটি অ্যারে। উদাহরণস্বরূপ, প্রদান DataGrouper(data, ["Phase", "Step"])
করবে:
[
{
"key": {Phase: "Phase 1", Step: "Step 1"},
"vals": [
{Task: "Task 1", Value: "5"},
{Task: "Task 2", Value: "10"}
]
},
{
"key": {Phase: "Phase 1", Step: "Step 2"},
"vals": [
{Task: "Task 1", Value: "15"},
{Task: "Task 2", Value: "20"}
]
},
{
"key": {Phase: "Phase 2", Step: "Step 1"},
"vals": [
{Task: "Task 1", Value: "25"},
{Task: "Task 2", Value: "30"}
]
},
{
"key": {Phase: "Phase 2", Step: "Step 2"},
"vals": [
{Task: "Task 1", Value: "35"},
{Task: "Task 2", Value: "40"}
]
}
]
DataGrouper.register
একটি ফাংশন গ্রহণ করে এবং একটি নতুন ফাংশন তৈরি করে যা প্রাথমিক ডেটা এবং বৈশিষ্ট্যগুলিকে গ্রুপ অনুসারে গ্রহণ করে। এই নতুন ফাংশনটি উপরের হিসাবে আউটপুট ফর্ম্যাটটি নেয় এবং পরিবর্তে তাদের প্রত্যেকের বিরুদ্ধে আপনার ফাংশনটি চালায়, নতুন অ্যারে ফিরিয়ে দেয়। উত্পন্ন ফাংশনটি DataGrouper
আপনার সরবরাহ করা নাম অনুসারে সম্পত্তি হিসাবে সংরক্ষণ করা হয় এবং আপনি কেবল স্থানীয় রেফারেন্স চাইলে ফিরে আসে।
ঠিক আছে যে অনেক ব্যাখ্যা। কোডটি যুক্তিসঙ্গতভাবে সোজা, আমি আশা করি!