সঙ্গে Backbone.js আমি করেছি সংগ্রহে একটি comparator ফাংশন সেট আপ পেয়েছিলাম। এটি দুর্দান্তভাবে মডেলগুলি বাছাই করছে তবে আমি ক্রমটি বিপরীত করতে চাই।
আমি কীভাবে মডেলগুলিকে আরোহণের পরিবর্তে অবতরণ ক্রমে সাজিয়ে রাখতে পারি?
সঙ্গে Backbone.js আমি করেছি সংগ্রহে একটি comparator ফাংশন সেট আপ পেয়েছিলাম। এটি দুর্দান্তভাবে মডেলগুলি বাছাই করছে তবে আমি ক্রমটি বিপরীত করতে চাই।
আমি কীভাবে মডেলগুলিকে আরোহণের পরিবর্তে অবতরণ ক্রমে সাজিয়ে রাখতে পারি?
উত্তর:
ঠিক আছে, আপনি তুলনামূলক থেকে নেতিবাচক মান ফিরে আসতে পারেন। উদাহরণস্বরূপ, যদি আমরা ব্যাকবোন এর সাইট থেকে নেওয়া উদাহরণটি গ্রহণ করি এবং ক্রমটি বিপরীত করতে চাই তবে এটি দেখতে এরকম হবে:
var Chapter = Backbone.Model;
var chapters = new Backbone.Collection;
chapters.comparator = function(chapter) {
return -chapter.get("page"); // Note the minus!
};
chapters.add(new Chapter({page: 9, title: "The End"}));
chapters.add(new Chapter({page: 5, title: "The Middle"}));
chapters.add(new Chapter({page: 1, title: "The Beginning"}));
alert(chapters.pluck('title'));
ব্যক্তিগতভাবে, আমি এখানে প্রদত্ত যে কোনও সমাধান নিয়ে খুশি নই:
-1 সমাধান দ্বারা গুণমান যখন সকারের ধরণটি সংখ্যাযুক্ত হয় তখন কাজ করতে ব্যর্থ হয়। যদিও এর চারপাশে উপায় রয়েছে ( Date.getTime()
উদাহরণস্বরূপ ফোন করে) এই মামলাগুলি সুনির্দিষ্ট। ক্ষেত্রের নির্দিষ্ট ধরণের বাছাইয়ের বিষয়ে উদ্বিগ্ন না হয়ে যে কোনও ধরণের দিকনির্দেশকে বিপরীত করার আমি একটি সাধারণ উপায় চাই।
স্ট্রিং সলিউশনটির জন্য, একবারে একটি স্ট্রিংয়ের একটি অক্ষর তৈরি করা একটি পারফরম্যান্স বাধা হিসাবে মনে হয়, বিশেষত বড় সংগ্রহগুলি ব্যবহার করার সময় (বা প্রকৃতপক্ষে বৃহত্তর সাজানোর ক্ষেত্রের স্ট্রিংগুলি)
স্ট্রিং, তারিখ এবং সংখ্যাসূচক ক্ষেত্রগুলির জন্য দুর্দান্তভাবে কাজ করে এমন একটি সমাধান এখানে দেওয়া হয়েছে:
প্রথমত, এমন একটি তুলনামূলক ঘোষণা করুন যা এই জাতীয় পছন্দ অনুসারে বাছাইয়ের মাধ্যমে ফাংশনটির ফলাফলকে বিপরীত করবে:
function reverseSortBy(sortByFunction) {
return function(left, right) {
var l = sortByFunction(left);
var r = sortByFunction(right);
if (l === void 0) return -1;
if (r === void 0) return 1;
return l < r ? 1 : l > r ? -1 : 0;
};
}
এখন, আপনি যদি বাছাইয়ের দিকটি উল্টাতে চান তবে আমাদের যা করতে হবে তা হ'ল:
var Chapter = Backbone.Model;
var chapters = new Backbone.Collection;
// Your normal sortBy function
chapters.comparator = function(chapter) {
return chapter.get("title");
};
// If you want to reverse the direction of the sort, apply
// the reverseSortBy function.
// Assuming the reverse flag is kept in a boolean var called reverseDirection
if(reverseDirection) {
chapters.comparator = reverseSortBy(chapters.comparator);
}
chapters.add(new Chapter({page: 9, title: "The End"}));
chapters.add(new Chapter({page: 5, title: "The Middle"}));
chapters.add(new Chapter({page: 1, title: "The Beginning"}));
alert(chapters.pluck('title'));
এই কাজ করার কারণটি হ'ল Backbone.Collection.sort
যদি বাছাই ফাংশনে দুটি যুক্তি থাকে তবে ভিন্নভাবে আচরণ করে। এই ক্ষেত্রে, এটি একইভাবে আচরণ করে যেমনটি তুলনাকারী .ুকে পড়ে Array.sort
। এই সমাধানটি দুটি যুক্তি তুলকের তুলনায় একক যুক্তি সাজানোর মাধ্যমে ফাংশনটিকে অভিযোজিত করে এবং ফলাফলটি উল্টিয়ে কাজ করে।
ব্যাকবোন.জেএস-এর সংগ্রহের তুলনা করা বোঝা যায় বোঝা-বোঝা.জেএস পদ্ধতি _.সোর্টবাইয়ের মাধ্যমে। সাজ্টবাইয়ের প্রয়োগটি জাভাস্ক্রিপ্টকে "মোড়ানো" শেষ করে s স্ট্রিংয়ের সরল অবহেলা এনএএন ফিরে আসা শেষ করে এবং বাছাই করে।
আপনার যদি স্ট্রিংগুলির সাথে বিপরীত বর্ণানুক্রমিক সাজানোর মতো বিপরীত বাছাই করতে হয় তবে এটি করার একটি সত্যই হ্যাকিশ উপায় এখানে রয়েছে:
comparator: function (Model) {
var str = Model.get("name");
str = str.toLowerCase();
str = str.split("");
str = _.map(str, function(letter) {
return String.fromCharCode(-(letter.charCodeAt(0)));
});
return str;
}
এটি কোনওভাবেই সুন্দর নয়, তবে এটি একটি "স্ট্রিং নেগেটর"। জাভাস্ক্রিপ্টে নেটিভ অবজেক্টের ধরণের পরিবর্তন করতে যদি আপনার কোনও কোয়ালিফাই না থাকে তবে আপনি স্ট্রিং নেগেটরটি বের করে স্ট্রিং.প্রোটোটাইপ হিসাবে একটি পদ্ধতি হিসাবে যুক্ত করে কোড স্পষ্ট করে তুলতে পারেন। তবে আপনি সম্ভবত এটি করতে চান তবে আপনি কী করছেন তা যদি আপনি জানেন তবে জাভাস্ক্রিপ্টে নেটিভ অবজেক্টের ধরণের পরিবর্তন করা অপ্রত্যাশিত পরিণতি ঘটাতে পারে।
আমার সমাধানটি ছিল সাজানোর পরে ফলাফলগুলি বিপরীত করা।
প্রথমে নীরবতার সাথে ডাবল রেন্ডারিং রোধ করতে, তারপরে 'রিসেট' ট্রিগার করুন।
collections.sort({silent:true})
collections.models = collections.models.reverse();
collections.trigger('reset', collections, {});
-Date.getTime()
, সম্ভবত যদি আপনি বিশ্বাস করেন যে আপনার সিস্টেমে তারিখগুলি ইউনিক্স সময়কে অতিক্রম করবে। বর্ণানুক্রমিক জন্য, উপরে অ্যান্ড্রু এর উত্তর দেখুন।
আপনি বর্তমানে যে ডেটা করছেন তা ফিরিয়ে দেওয়ার পরিবর্তে কিছু বিপরীতমুখী প্রাকৃতিক মান ফেরানোর জন্য আপনার তুলনামূলক ফাংশনটি সংশোধন করুন। কিছু কোড থেকে: http://docamentcloud.github.com/backbone/# Colલેક્-- সংস্থাপক
উদাহরণ:
var Chapter = Backbone.Model;
var chapters = new Backbone.Collection;
/* Method 1: This sorts by page number */
chapters.comparator = function(chapter) {
return chapter.get("page");
};
/* Method 2: This sorts by page number in reverse */
chapters.comparator = function(chapter) {
return -chapter.get("page");
};
chapters.add(new Chapter({page: 9, title: "The End"}));
chapters.add(new Chapter({page: 5, title: "The Middle"}));
chapters.add(new Chapter({page: 1, title: "The Beginning"}));
নিম্নলিখিতটি আমার পক্ষে ভাল কাজ করেছে:
comparator: function(a, b) {
// Optional call if you want case insensitive
name1 = a.get('name').toLowerCase();
name2 = b.get('name').toLowerCase();
if name1 < name2
ret = -1;
else if name1 > name2
ret = 1;
else
ret = 0;
if this.sort_dir === "desc"
ret = -ret
return ret;
}
collection.sort_dir = "asc";
collection.sort(); // returns collection in ascending order
collection.sort_dir = "desc";
collection.sort(); // returns collection in descending order
আমি কিছু পড়েছি যেখানে ব্যাকবোন তুলনাকারী ফাংশন জাভাস্ক্রিপ্ট অ্যারে.প্রোটোটাইপ.সোর্ট () ফাংশনটি ব্যবহার করে বা নকল করে। এর অর্থ এটি সংগ্রহের প্রতিটি মডেলের সাজানোর ক্রম সিদ্ধান্ত নিতে 1, -1 বা 0 ব্যবহার করে। এটি অবিচ্ছিন্নভাবে আপডেট হয় এবং তুলনাকারীর উপর ভিত্তি করে সংগ্রহটি সঠিক ক্রমে থাকে।
অ্যারে.প্রোটোটাইপ.সোর্ট () সম্পর্কিত তথ্য এখানে পাওয়া যাবে: https://developer.mozilla.org/en-US/docs/Web/JavaScript/References/Global_Objects/Array/sort?redirectlocale=en-US&redirectslug=JavaScript% 2F রেফারেন্স% 2F গ্লোবাল_অবজেক্টস% 2 এফরায়ে% 2 এফসোর্ট
এই প্রশ্নের অনেক উত্তর পৃষ্ঠায় ফেরত দেওয়ার ঠিক আগে অর্ডারটিকে বিপরীত করে দেয়। এটি আদর্শ নয়।
মোজিলায় উপরোক্ত নিবন্ধটি গাইড হিসাবে আমি নিম্নলিখিত কোডটি ব্যবহার করে আমার সংগ্রহটি বিপরীত ক্রমে সাজিয়ে রাখতে সক্ষম হয়েছি, তবে আমরা সংগ্রহটি কেবল বর্তমান ক্রমে পৃষ্ঠাতে রেন্ডার করি এবং অর্ডারটি বিপরীত করার জন্য আমরা একটি পতাকা (বিপরীতমুখী নির্দেশ) ব্যবহার করতে পারি ।
//Assuming this or similar will be in your Backbone.Collection.
sortKey: 'id', //The field name of the item in your collection
reverseSortDirection: false,
comparator: function(a, b) {
var sampleDataA = a.get(this.sortKey),
sampleDataB = b.get(this.sortKey);
if (this.reverseSortDirection) {
if (sampleDataA > sampleDataB) { return -1; }
if (sampleDataB > sampleDataA) { return 1; }
return 0;
} else {
if (sampleDataA < sampleDataB) { return -1; }
if (sampleDataB < sampleDataA) { return 1; }
return 0;
}
},
সংকলন বা মডেল পরিবর্তনের ক্ষেত্রে দুটি মডেল বাদে তুলনাকারী কম্পাটার ফাংশনটি সঞ্চালিত হয় এবং সংগ্রহের ক্রম পরিবর্তন করে।
আমি সংখ্যা এবং স্ট্রিংয়ের সাথে এই পদ্ধতির পরীক্ষা করেছি এবং এটি আমার জন্য নিখুঁতভাবে কাজ করছে বলে মনে হচ্ছে।
আমি সত্যিই আশা করি যে এই উত্তরটি বেশিরভাগ ক্ষেত্রে এই সমস্যার সাথে লড়াই করেছি এবং প্রায়শই একটি কাজ ব্যবহার করে শেষ করতে সহায়তা করতে পারে।
sortKey
এবং reverseSortDirection
এবং কল .sort()
সংগ্রহের একটি হ্যান্ডল যে কোনো ভিউ থেকে। আমার কাছে অন্যান্য উচ্চ-ভোট দেওয়া উত্তরের চেয়ে সহজ।
এই সাজানোর পদ্ধতিতে ওভাররাইড করে মার্জিতভাবে করা যায়। এখানে একটি উদাহরণ
var SortedCollection = Backbone.Collection.extend({
initialize: function () {
// Default sort field and direction
this.sortField = "name";
this.sortDirection = "ASC";
},
setSortField: function (field, direction) {
this.sortField = field;
this.sortDirection = direction;
},
comparator: function (m) {
return m.get(this.sortField);
},
// Overriding sortBy (copied from underscore and just swapping left and right for reverse sort)
sortBy: function (iterator, context) {
var obj = this.models,
direction = this.sortDirection;
return _.pluck(_.map(obj, function (value, index, list) {
return {
value: value,
index: index,
criteria: iterator.call(context, value, index, list)
};
}).sort(function (left, right) {
// swap a and b for reverse sort
var a = direction === "ASC" ? left.criteria : right.criteria,
b = direction === "ASC" ? right.criteria : left.criteria;
if (a !== b) {
if (a > b || a === void 0) return 1;
if (a < b || b === void 0) return -1;
}
return left.index < right.index ? -1 : 1;
}), 'value');
}
});
সুতরাং আপনি এটি ব্যবহার করতে পারেন:
var collection = new SortedCollection([
{ name: "Ida", age: 26 },
{ name: "Tim", age: 5 },
{ name: "Rob", age: 55 }
]);
//sort by "age" asc
collection.setSortField("age", "ASC");
collection.sort();
//sort by "age" desc
collection.setSortField("age", "DESC");
collection.sort();
এই সমাধানটি ক্ষেত্রের ধরণের উপর নির্ভর করে না।
যারা কেবলমাত্র বর্তমান ক্রমটি ফ্লিপ করতে চান তাদের জন্য এখানে একটি সহজ সমাধান is আপনার যদি এমন কোনও টেবিল থাকে যার কলাম দুটি দিক দিয়ে অর্ডার করা যেতে পারে।
collection.models = collection.models.reverse()
আপনি যদি টেবিল কেস (কফিসক্রিপ্ট) এর প্রতি আগ্রহী হন তবে আপনি এটির মতো এই জাতীয় কিছু সংযুক্ত করতে পারেন:
collection.comparator = (model) ->
model.get(sortByType)
collection.sort()
if reverseOrder
collection.models = collection.models.reverse()
আমার কিছুটা আলাদা প্রয়োজন ছিল, এটিতে আমি আমার মডেলগুলি একটি টেবিলের মধ্যে প্রদর্শন করছি এবং আমি যে কোনও সংঘর্ষের (মডেল সম্পত্তি) বা আরোহী বা উতরাইয়ের দ্বারা সেগুলি বাছাই করতে সক্ষম হতে চাই।
সমস্ত কেস কাজ করার জন্য এটি মোটামুটি পরিমাণে হাঁকিয়েছে (যেখানে মানগুলি স্ট্রিং, খালি স্ট্রিং, তারিখ, সংখ্যা হতে পারে be তবে আমি মনে করি এটি বেশ কাছাকাছি)।
inverseString: function(str)
{
return str.split("").map(function (letter) { return String.fromCharCode(-(letter.charCodeAt(0))); }).join("");
}
getComparisonValue: function (val, desc)
{
var v = 0;
// Is a string
if (typeof val === "string")
{
// Is an empty string, upgrade to a space to avoid strange ordering
if(val.length === 0)
{
val = " ";
return desc ? this.inverseString(val) : val;
}
// Is a (string) representing a number
v = Number(val);
if (!isNaN(v))
{
return desc ? -1 * v : v;
}
// Is a (string) representing a date
v = Date.parse(val);
if (!isNaN(v))
{
return desc ? -1 * v : v;
}
// Is just a string
return desc ? this.inverseString(val) : val;
}
// Not a string
else
{
return desc ? -1 * val : val;
}
},
ব্যবহার:
comparator: function (item)
{
// Store the collumn to 'sortby' in my global model
var property = app.collections.global.get("sortby");
// Store the direction of the sorting also in the global model
var desc = app.collections.global.get("direction") === "DESC";
// perform a comparison based on property & direction
return this.getComparisonValue(item.get(property), desc);
},
আমি সম্পূর্ণরূপে মডেল অ্যারে বিপরীত করতে বাছাই ফাংশন ওভাররড। এছাড়াও আমি বিপরীতটি সম্পূর্ণ না হওয়া অবধি 'বাছাই' ইভেন্টটি ট্রিগার বন্ধ করেছিলাম।
sort : function(options){
options = options || {};
Backbone.Collection.prototype.sort.call(this, {silent:true});
this.models.reverse();
if (!options.silent){
this.trigger('sort', this, options);
}
return this;
},
সম্প্রতি এই ইস্যুতে দৌড়েছে এবং কেবল একটি রোর্টপোর্ট পদ্ধতি যুক্ত করার সিদ্ধান্ত নিয়েছে।
Collection = Backbone.Collection.extend({
comparator:function(a, b){
return a>b;
},
rsort:function(){
var comparator = this.comparator;
this.comparator = function(){
return -comparator.apply(this, arguments);
}
this.sort();
this.comparator = comparator;
}
});
আশা করি কেউ এই কাজে লাগবে
ইন্ডোরস্কোরএস ব্যবহার করে সংগ্রহের মডেলগুলিকে বিপরীতভাবে সাজানোর একটি দ্রুত এবং সহজ উপায়
var reverseCollection = _.sortBy(this.models, function(model) {
return self.indexOf(model) * -1;
});