অবজেক্টগুলির জটিল অ্যারে বাছাই করা (আরও)
যেহেতু আপনি সম্ভবত এই অ্যারের মতো আরও জটিল ডেটা স্ট্রাকচারের মুখোমুখি হচ্ছেন, তাই আমি সমাধানটি প্রসারিত করব।
টি এল; ডিআর
@ ইজ-ইজকানের খুব সুন্দর উত্তরের উপর ভিত্তি করে আরও প্লাগযোগ্য সংস্করণ ।
সমস্যা
আমি নীচের মুখোমুখি হয়েছি এবং এটি পরিবর্তন করতে পারিনি। আমিও সাময়িকভাবে বস্তুটি চাটুকার করতে চাইনি। না আমি আন্ডারস্কোর / লোডাশ ব্যবহার করতে চাইনি, প্রধানত পারফরম্যান্সের কারণে এবং এটিকে নিজে প্রয়োগ করার মজাদার জন্য।
var People = [
{Name: {name: "Name", surname: "Surname"}, Middlename: "JJ"},
{Name: {name: "AAA", surname: "ZZZ"}, Middlename:"Abrams"},
{Name: {name: "Name", surname: "AAA"}, Middlename: "Wars"}
];
লক্ষ্য
লক্ষ্যটি প্রাথমিকভাবে People.Name.name
এবং দ্বিতীয়ত অনুসারে বাছাই করাPeople.Name.surname
অবমুক্ত
এখন, বেস সলিউশনে গতিশীলভাবে বাছাই করার জন্য বৈশিষ্ট্যগুলি গণনা করতে বন্ধনী স্বরলিপি ব্যবহার করে uses এখানে, যদিও আমরা ব্রেকেট স্বরলিখনকে গতিশীলভাবেও বানাতে হবে, যেহেতু আপনি আশা করেন যে কিছু People['Name.name']
কাজ করবে - যা হয় না।
কেবলমাত্র করছেন People['Name']['name']
, অন্য দিকে স্ট্যাটিক এবং শুধুমাত্র আপনি নিচে যেতে পারবেন এন -th স্তর।
সমাধান
এখানে প্রধান সংযোজন হ'ল বস্তু গাছের নীচে হাঁটতে হবে এবং শেষ পাতার মান নির্ধারণ করতে হবে, আপনাকে নির্দিষ্ট করতে হবে, পাশাপাশি কোনও মধ্যস্থতাকারী পাতাকেও।
var People = [
{Name: {name: "Name", surname: "Surname"}, Middlename: "JJ"},
{Name: {name: "AAA", surname: "ZZZ"}, Middlename:"Abrams"},
{Name: {name: "Name", surname: "AAA"}, Middlename: "Wars"}
];
People.sort(dynamicMultiSort(['Name','name'], ['Name', '-surname']));
// Results in...
// [ { Name: { name: 'AAA', surname: 'ZZZ' }, Middlename: 'Abrams' },
// { Name: { name: 'Name', surname: 'Surname' }, Middlename: 'JJ' },
// { Name: { name: 'Name', surname: 'AAA' }, Middlename: 'Wars' } ]
// same logic as above, but strong deviation for dynamic properties
function dynamicSort(properties) {
var sortOrder = 1;
// determine sort order by checking sign of last element of array
if(properties[properties.length - 1][0] === "-") {
sortOrder = -1;
// Chop off sign
properties[properties.length - 1] = properties[properties.length - 1].substr(1);
}
return function (a,b) {
propertyOfA = recurseObjProp(a, properties)
propertyOfB = recurseObjProp(b, properties)
var result = (propertyOfA < propertyOfB) ? -1 : (propertyOfA > propertyOfB) ? 1 : 0;
return result * sortOrder;
};
}
/**
* Takes an object and recurses down the tree to a target leaf and returns it value
* @param {Object} root - Object to be traversed.
* @param {Array} leafs - Array of downwards traversal. To access the value: {parent:{ child: 'value'}} -> ['parent','child']
* @param {Number} index - Must not be set, since it is implicit.
* @return {String|Number} The property, which is to be compared by sort.
*/
function recurseObjProp(root, leafs, index) {
index ? index : index = 0
var upper = root
// walk down one level
lower = upper[leafs[index]]
// Check if last leaf has been hit by having gone one step too far.
// If so, return result from last step.
if (!lower) {
return upper
}
// Else: recurse!
index++
// HINT: Bug was here, for not explicitly returning function
// https://stackoverflow.com/a/17528613/3580261
return recurseObjProp(lower, leafs, index)
}
/**
* Multi-sort your array by a set of properties
* @param {...Array} Arrays to access values in the form of: {parent:{ child: 'value'}} -> ['parent','child']
* @return {Number} Number - number for sort algorithm
*/
function dynamicMultiSort() {
var args = Array.prototype.slice.call(arguments); // slight deviation to base
return function (a, b) {
var i = 0, result = 0, numberOfProperties = args.length;
// REVIEW: slightly verbose; maybe no way around because of `.sort`-'s nature
// Consider: `.forEach()`
while(result === 0 && i < numberOfProperties) {
result = dynamicSort(args[i])(a, b);
i++;
}
return result;
}
}
উদাহরণ
জেএসবিনে কাজের উদাহরণ