वस्तुओं की छंटाई (अधिक) जटिल सारणी
चूंकि आप शायद इस सरणी की तरह अधिक जटिल डेटा संरचनाओं का सामना करते हैं, इसलिए मैं समाधान का विस्तार करूंगा।
टी एल; डॉ
अधिक सुंदर संस्करण @ ege-canzcan के बहुत प्यारे जवाब पर आधारित हैं ।
मुसीबत
मैंने नीचे का सामना किया और इसे बदल नहीं सका। मैं भी वस्तु को अस्थायी रूप से समतल नहीं करना चाहता था। न ही मैं अंडरस्कोर / लॉश का उपयोग करना चाहता था, मुख्य रूप से प्रदर्शन कारणों और इसे स्वयं लागू करने के लिए मज़ेदार।
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
बाधाओं
अब, बेस समाधान में ब्रैकेट संकेतन का उपयोग गतिशील रूप से सॉर्ट करने के लिए गुणों की गणना करने के लिए किया जाता है। यहाँ, हालांकि, हमें गतिशील रूप से भी ब्रैकेट नोटेशन का निर्माण करना होगा, क्योंकि आप कुछ पसंद करेंगेPeople['Name.name']
काम करेंगे - जो नहीं करते हैं।
बस People['Name']['name']
दूसरी ओर, स्थिर है और केवल आपको n को नीचे जाने की अनुमति देता है वें स्तर।
समाधान
यहां मुख्य जोड़ वस्तु के पेड़ के नीचे चलना और अंतिम पत्ती के मूल्य का निर्धारण करना होगा, आपको निर्दिष्ट करना होगा, साथ ही किसी भी मध्यवर्ती पत्ती को भी।
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;
}
}
उदाहरण
जेएसबीएन पर काम करने का उदाहरण