लॉडश: ऑर्डरबाय का उपयोग करके संग्रह पर असंवेदनशील छँटाई के मामले को कैसे करें?


87

मैंने इस उत्तर की जाँच की लेकिन उसी परिणाम को प्राप्त करने के लिए, जो कि केस-असंवेदनशील सॉर्टिंग प्राप्त करने के लिए है, मुझे orderByइसके बजाय उपयोग करने की आवश्यकता है sortByक्योंकि यह सॉर्ट क्रम को निर्दिष्ट करने की क्षमता देता है

जिस तरह से मैंने इसे प्राप्त करने के लिए एक क्लोन "मध्य" सरणी बनाने के लिए निचली स्थिति के लिए मैप किया था name:

const users = [
  { name: 'A', age: 48 },
  { name: 'B', age: 34 },
  { name: 'b', age: 40 },
  { name: 'a', age: 36 }
];

let lowerCaseUsers = _.clone(users);

lowerCaseUsers = lowerCaseUsers.map((user) => {
  user.name = user.name.toLowerCase();
  return user;
});

const sortedUsers = _.orderBy(lowerCaseUsers, ['name'], ['desc']);

console.log(sortedUsers);

यह वास्तव में महंगा लगता है और यह कई छंटाई और गतिशील गुणों के नाम के साथ और भी जटिल होगा।

क्या कोई बेहतर विचार है?


यहाँ एक प्लंकर है: https://plnkr.co/edit/i1ywyxjFctuNfHtPTcgG

जवाबों:


188

प्रलेखन निर्दिष्ट करता है कि आप के रूप में "iteratee" एक समारोह पारित कर सकते हैं:

[iteratees = [_। पहचान]] (Array [] | फंक्शन [] | ऑब्जेक्ट [] | string []): iteratees द्वारा सॉर्ट करने के लिए।

तो आप कर सकते हैं

const users = [
  { name: 'A', age: 48 },
  { name: 'B', age: 34 },
  { name: 'b', age: 40 },
  { name: 'a', age: 36 }
];

const sortedUsers = _.orderBy(users, [user => user.name.toLowerCase()], ['desc']);
console.log(sortedUsers);
<script src="https://cdn.jsdelivr.net/lodash/4.13.1/lodash.min.js"></script>


1
यह पुराने ब्राउज़रों पर विफल हो सकता है।
भाप से चलने वाला

14
अगर आपका मतलब है कि यह ES6 का समर्थन नहीं करने वाले ब्राउज़र में एक सिंटैक्स त्रुटि को फेंक देगा, तो हाँ, बिल्कुल। मैं एक "सामान्य" समारोह के लिए तीर समारोह परिवर्तित (और छोड़ देंगे constकरने के लिए varपाठक को व्यायाम के रूप में)।
फेलिक्स क्लिंग

@ कैप्टन: ऐसा कोई कारण नहीं है कि यह नहीं होना चाहिए।
फेलिक्स क्लिंग

2
मैं निम्नलिखित के साथ @ TheCaptan के प्रश्न का प्रयास कर रहा हूं, लेकिन एक संकलक त्रुटि प्राप्त करें:const sortedUsers = _.orderBy(users, [user => user[propToSort].toLowerCase()], ['desc']);
im1dermike

1
@ im1dermike: आप शायद .toString()वहां लोअरकेस पर कॉल करने से पहले उपयोग करना चाहते हैं , इसके अलावा यदि आप property.somethingप्रोपोटॉर्ट के लिए उपयोग करना चाहते हैं और इसी तरह आप उपयोग कर सकते हैं _.get(user, propToSort)(हो सकता है कि यह किसी और की मदद करेगा)
Soniku

10

कई गुणों द्वारा आदेश:

const users = [
  { name: 'A', age: 48 },
  { name: 'B', age: 34 },
  { name: 'b', age: 40 },
  { name: 'a', age: 36 }
]

const nameSorter = user => user.name.toLowerCase()
const ageSorter = 'age'

const sortedUsers = _.orderBy(users, [nameSorter, ageSorter], ['desc', 'asc'])

2

आप गतिशील नेस्टेड विशेषताओं के आधार पर फेलिक्स क्लिंग उदाहरण को _.get फ़ंक्शन के साथ जोड़ सकते हैं:

const _ = require('lodash');

let test = [{ a: {b:'AA'}},{a: {b:'BB'} }, {a: {b: 'bb'}}, {a:{b:'aa'}}];

let attrPath = 'a.b';

_.orderBy(test, [item => _.get(item, attrPath).toLowerCase()]);
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.