স্ট্রিং সম্পত্তি মান দ্বারা বস্তুর অ্যারে বাছাই করুন


2761

আমার কাছে জাভাস্ক্রিপ্ট অবজেক্টের একটি অ্যারে রয়েছে:

var objs = [ 
    { first_nom: 'Lazslo', last_nom: 'Jamf'     },
    { first_nom: 'Pig',    last_nom: 'Bodine'   },
    { first_nom: 'Pirate', last_nom: 'Prentice' }
];

আমি কীভাবে last_nomজাভাস্ক্রিপ্টের মান অনুসারে তাদের বাছাই করতে পারি ?

আমি জানি sort(a,b), তবে এটি কেবল স্ট্রিং এবং সংখ্যাগুলিতে কাজ করে বলে মনে হচ্ছে। toString()আমার অবজেক্টগুলিতে কি আমাকে কোনও পদ্ধতি যুক্ত করতে হবে?


7
এই স্ক্রিপ্টটি আপনাকে কেবল এটি করার অনুমতি দেয় যদি না আপনি নিজের তুলনা ফাংশন বা ক্রম
Baversjo

দ্রুততম উপায় হ'ল isomorphic সারণি -অ্যারে মডিউলটি যা ব্রাউজার এবং নোড উভয় ক্ষেত্রেই স্থানীয়ভাবে কাজ করে, যে কোনও ধরণের ইনপুট, গণিত ক্ষেত্র এবং কাস্টম সাজানোর আদেশকে সমর্থন করে।
লয়েড

উত্তর:


3915

এটি আপনার নিজের তুলনা ফাংশন লিখতে যথেষ্ট সহজ:

function compare( a, b ) {
  if ( a.last_nom < b.last_nom ){
    return -1;
  }
  if ( a.last_nom > b.last_nom ){
    return 1;
  }
  return 0;
}

objs.sort( compare );

অথবা ইনলাইন (সি / ও মার্কো ডেমাইও):

objs.sort((a,b) => (a.last_nom > b.last_nom) ? 1 : ((b.last_nom > a.last_nom) ? -1 : 0)); 

441
বা ইনলাইন :জেজেস.সোর্ট (ফাংশন (ক, খ) {রিটার্ন (a.last_nom> b.last_nom)? 1: ((b.last_nom> a.last_nom)? -1: 0);});
মার্কো ডেমাইও


176
return a.last_nom.localeCompare(b.last_nom)কাজ করবে।
সার্বারবাস

146
ক্ষেত্রটি সংখ্যাসূচক যেখানে বাছাইয়ের জন্য তাদের জন্য তুলনা করুন ফাংশন বডি: return a.value - b.value;(এএসসি)
আন্দ্রে ফিগুয়েরেদো

20
localeCompareবিদেশী ভাষাগুলিতে উচ্চারণকৃত চরিত্রগুলি ব্যবহার করার সাথে সাথে আরও মার্জিত C
মার্কোস লিমা

839

আপনি একটি গতিশীল বাছাই ফাংশনও তৈরি করতে পারেন যা তাদের পাস করা মান অনুসারে বস্তুগুলিকে বাছাই করে:

function dynamicSort(property) {
    var sortOrder = 1;
    if(property[0] === "-") {
        sortOrder = -1;
        property = property.substr(1);
    }
    return function (a,b) {
        /* next line works with strings and numbers, 
         * and you may want to customize it to your needs
         */
        var result = (a[property] < b[property]) ? -1 : (a[property] > b[property]) ? 1 : 0;
        return result * sortOrder;
    }
}

সুতরাং আপনি এই জাতীয় কিছু অ্যারে থাকতে পারে:

var People = [
    {Name: "Name", Surname: "Surname"},
    {Name:"AAA", Surname:"ZZZ"},
    {Name: "Name", Surname: "AAA"}
];

... এবং আপনি যখন এটি কাজ করবে:

People.sort(dynamicSort("Name"));
People.sort(dynamicSort("Surname"));
People.sort(dynamicSort("-Surname"));

আসলে এটি ইতিমধ্যে প্রশ্নের উত্তর দেয়। নীচে অংশটি লিখিত কারণ অনেক লোক আমার সাথে যোগাযোগ করেছে, অভিযোগ করে যে এটি একাধিক পরামিতিগুলির সাথে কাজ করে না

একাধিক পরামিতি

আপনি একাধিক বাছাই পরামিতি সহ বাছাই ফাংশন উত্পাদন করতে নীচের ফাংশনটি ব্যবহার করতে পারেন।

function dynamicSortMultiple() {
    /*
     * save the arguments object as it will be overwritten
     * note that arguments object is an array-like object
     * consisting of the names of the properties to sort by
     */
    var props = arguments;
    return function (obj1, obj2) {
        var i = 0, result = 0, numberOfProperties = props.length;
        /* try getting a different result from 0 (equal)
         * as long as we have extra properties to compare
         */
        while(result === 0 && i < numberOfProperties) {
            result = dynamicSort(props[i])(obj1, obj2);
            i++;
        }
        return result;
    }
}

যা আপনাকে এরকম কিছু করতে সক্ষম করবে:

People.sort(dynamicSortMultiple("Name", "-Surname"));

সাবক্লাসিং অ্যারে

আমাদের মধ্যে ভাগ্যবানদের জন্য যারা ES6 ব্যবহার করতে পারেন, যা দেশীয় অবজেক্টগুলিকে প্রসারিত করতে দেয়:

class MyArray extends Array {
    sortBy(...args) {
        return this.sort(dynamicSortMultiple.apply(null, args));
    }
}

এটি এটি সক্ষম করবে:

MyArray.from(People).sortBy("Name", "-Surname");

দয়া করে নোট করুন যে জাভাস্ক্রিপ্টে থাকা সম্পত্তির নামগুলি কোনও স্ট্রিং হতে পারে এবং যদি আপনার "-" দিয়ে প্রারম্ভিক বৈশিষ্ট্য থাকে (অত্যন্ত অসম্ভব এবং সম্ভবত একটি ভাল ধারণা নয়) তবে বিপরীত সাজানোর হিসাবে অন্য কিছু ব্যবহার করতে আপনাকে ডায়নামিকসোর্ট ফাংশনটি সংশোধন করতে হবে you'll সূচক।
ইজ্কান

আমি লক্ষ করেছি যে dynamicSort()উপরের উদাহরণে ছোট হাতের অক্ষরের আগে মূল অক্ষর স্থাপন করা হবে। উদাহরণস্বরূপ, যদি আমি মান APd, Aklinএবং Abe- একটি উচ্চক্রমে ফলাফল সাজানোর হওয়া উচিত Abe, Aklin, APd। কিন্তু আপনার উদাহরণ দিয়ে ফলাফল নেই APd, Abe, Aklin। যাইহোক এই আচরণটি সংশোধন করতে?
লয়েড ব্যাংকগুলি

6
@ লয়ডব্যাঙ্কস যদি আপনি স্ট্রিংয়ের জন্য এটি কঠোরভাবে ব্যবহার করে থাকেন তবে আপনি এর var result = a[property].localeCompare(b[property]);পরিবর্তে ব্যবহার করতে পারেন var result = (a[property] < b[property]) ? -1 : (a[property] > b[property]) ? 1 : 0;
ইজ্কান

1
@ এজেজকান এটি হয় আইটেমগুলি উপরে বা নীচে রেখে দেওয়া উচিত, এখানে প্রয়োগের প্রয়োগটি আমি পেস্টবিন.
com

1
এটি দুর্দান্ত সমাধান তবে আপনি যদি সংখ্যাগুলির তুলনা করেন তবে একটি সমস্যা আছে। চেক করার আগে দয়া করে এটি যুক্ত করুন:if( !isNaN(a[property]) ) a[property] = Number(a[property]); if( !isNaN(b[property]) ) b[property] = Number(b[property]);
আইভিজান স্টিফান স্টিপিয়ি

413

ES6 / ES2015 বা তার পরে আপনি এই পদ্ধতিতে করতে পারেন:

objs.sort((a, b) => a.last_nom.localeCompare(b.last_nom));

ES6 / ES2015 এর আগে

objs.sort(function(a, b) {
    return a.last_nom.localeCompare(b.last_nom)
});

29
এটি জেএস ১.১ থেকে পাওয়া যায়, এটিতে চর্বিযুক্ত তীরটি ES6 / 2015 অংশ। তবে এখনও খুব দরকারী, এবং আমার মতে সেরা উত্তর
জন হার্ডিং

13
@প্রিতিকেলওয়ালকার: আপনার যদি বিপরীত দরকার হয় তবে এটি কেবল একটি এবং খ তুলনা পরিবর্তন করুন: objs.sort ((a, b) => b.last_nom.localeCompare (a.last_nom));
ভ্লাদ বেজডেন

পরিবর্তে: এটা বাছাইয়ের জন্য ক্ষেত্র মোকাবেলার পাশাপাশি একটি সূচক ব্যবহার করা সম্ভব last_nomঅ্যারের মধ্যে ব্যবহার শুধু সংখ্যা: 1?
এবং-ব্রি

4
@ ভ্লাদবেজডেন আপনার উত্তরের জন্য ধন্যবাদ! এই সমাধানটি খুব ছোট প্রোগ্রামগত প্রচেষ্টা এবং সঠিক বাছাইয়ের ফলাফল এবং একটি স্ট্রিং অ্যারের মতো প্রথম: ["নাম 1", "নাম 10", "নাম 2", "অন্য কিছু", "নাম 11"]। আমি সঠিকভাবে কাজ করার জন্য বাছাই করেছিobjs.sort((a, b) => a.last_nom.localeCompare(b.last_nom, undefined, {numberic: true}));
বিজ্ঞানী

1
সংখ্যায় নেমে আসার সাথে এটি করতে: .sort ((a, b) => b.numberProperty - a.numberProperty)। আরোহী: .sort ((a, b) => a.numberProperty - b.numberProperty)
সেবাস্তিয়ান প্যাটেন

188

underscore.js

আন্ডারস্কোর ব্যবহার করুন, এর ছোট এবং দুর্দান্ত ...

সাজ্টবাই_সোর্টবি (তালিকা, পুনরুক্তিকারী, [প্রসঙ্গ]) তালিকার একটি সাজানো অনুলিপি প্রদান করে, প্রতিটি মানকে পুনরুক্তির মাধ্যমে চালনার ফলাফল দ্বারা আরোহণের ক্রমে স্থান করে নেওয়া। আইট্রেটর (যেমন দৈর্ঘ্য) অনুসারে বাছাই করার জন্য সম্পত্তিটির স্ট্রিং নামও হতে পারে।

var objs = [ 
  { first_nom: 'Lazslo',last_nom: 'Jamf' },
  { first_nom: 'Pig', last_nom: 'Bodine'  },
  { first_nom: 'Pirate', last_nom: 'Prentice' }
];

var sortedObjs = _.sortBy( objs, 'first_nom' );

18
ডেভিড, আপনি কি উত্তরটি সম্পাদনা করতে পারবেন var sortedObjs = _.sortBy( objs, 'first_nom' );? objsএর ফলস্বরূপ নিজেকে সাজানো হবে না । ফাংশন হবে আসতে একটি সাজানো অ্যারের। এটি এটি আরও স্পষ্ট করে তুলবে।
জেস

10
বিপরীত সাজানোর জন্য:var reverseSortedObjs = _.sortBy( objs, 'first_nom' ).reverse();
এরদল জি।

2
আপনার জাভাস্ক্রিপ্ট লিবারি "আন্ডারস্কোর" লোড করতে হবে:<script src="http://cdnjs.cloudflare.com/ajax/libs/underscore.js/1.8.3/underscore-min.js"> </script>
এবং ব্রি

5
Lodashযারা
এটিকে

2
লোডাশে এটি একই হবে: var sortedObjs = _.sortBy( objs, 'first_nom' );বা আপনি যদি এটি অন্য কোনও ক্রমে চান:var sortedObjs = _.orderBy( objs, ['first_nom'],['dsc'] );
ট্র্যাভিস হিটার

186

লোকেরা কেন এতো জটিল করে তোলে:

objs.sort(function(a, b){
  return a.last_nom > b.last_nom;
});

কঠোর ইঞ্জিনগুলির জন্য:

objs.sort(function(a, b){
  return a.last_nom == b.last_nom ? 0 : +(a.last_nom > b.last_nom) || -1;
});

বিপরীত বর্ণমালা অনুসারে বাছাই করতে অপারেটরকে অদলবদল করুন।


17
এটি আসলে সঠিক নয় কারণ সাজানোর ক্ষেত্রে ব্যবহৃত ফাংশনটি -1, 0, বা 1 ফিরে আসবে তবে উপরের ফাংশনটি বুলিয়ান দেয়। ক্রমটি ক্রোমে সূক্ষ্মভাবে কাজ করে তবে উদাহরণস্বরূপ ফ্যান্টমজেএসে ব্যর্থ হয়। দেখুন code.google.com/p/phantomjs/issues/detail?id=1090
schup

কিছু ইঞ্জিন বোকামির জন্য অ্যাকাউন্ট করে, এই উপায়টি এটির মতো শোষণকারী ছিল। আমি আমার উত্তরটি একটি উপযুক্ত সংস্করণ দিয়ে আপডেট করেছি।
p3lim

19
আমি প্রথম সংস্করণটি বের করার জন্য সম্পাদনা করার পরামর্শ দেব। এটির আরও সংযোগটি আরও আকর্ষণীয় দেখায় তবে এটি কার্যকর হয় না, কমপক্ষে নির্ভরযোগ্যভাবে নয়। যদি কেউ এটি একটি ব্রাউজারে চেষ্টা করে এবং এটি কাজ করে তবে তারা বুঝতে পারে না যে তাদের একটি সমস্যা রয়েছে (বিশেষত যদি তারা মন্তব্যগুলি না পড়ে)। দ্বিতীয় সংস্করণটি সঠিকভাবে কাজ করে তাই প্রথমটির জন্য সত্যিই কোনও প্রয়োজন নেই।
কেট

2
@ সিমন আমি প্রথমে "কিছুটা ভুল" সংস্করণটি পেয়ে সত্যিই প্রশংসা করেছি, যেহেতু কঠোর প্রয়োগটি বিশ্লেষণ করতে এবং বুঝতে কয়েক সেকেন্ড সময় নেয় এবং এটি ছাড়া এটি আরও শক্ত হয়ে উঠবে।
অ্যারন শেরম্যান

1
@ সিংহ 789 ঠিক এটি করুন:if(a.count == b.count) return a.name > b.name; else return a.count > b.count;
p3lim

62

আপনার যদি ডুপ্লিকেট শেষ নাম থাকে তবে আপনি এটিকে প্রথম নাম অনুসারে বাছাই করতে পারেন-

obj.sort(function(a,b){
  if(a.last_nom< b.last_nom) return -1;
  if(a.last_nom >b.last_nom) return 1;
  if(a.first_nom< b.first_nom) return -1;
  if(a.first_nom >b.first_nom) return 1;
  return 0;
});

@ ব্যাডফিলিংএবং -1 বা 1 এর অর্থ কী? আমি বুঝতে পেরেছি যে -1 এর আক্ষরিক অর্থ A কেবল B এর চেয়ে কম বাক্য গঠন দ্বারা, তবে কেন 1 বা -1 ব্যবহার করবেন? আমি দেখছি প্রত্যেকে এই সংখ্যাগুলি রিটার্ন মান হিসাবে ব্যবহার করছে, তবে কেন? ধন্যবাদ।
ক্রিস

1
@ ক্রিস 22 একটি নেতিবাচক সংখ্যা ফিরে এসেছে মানে অ্যারে bপরে আসা উচিত a। যদি কোনও ধনাত্মক সংখ্যা ফিরে aআসে তবে এর অর্থ হওয়া উচিত b। যদি 0ফিরে আসে তবে এর অর্থ তারা সমান বলে বিবেচিত হবে। আপনি সর্বদা ডকুমেন্টেশনটি পড়তে পারেন: বিকাশকারী.মোজিলা.আর.ইন-
ইউএস

@ ব্যাডফিলিংএ সম্পর্কে ব্যাখ্যা এবং লিঙ্কটির জন্য ধন্যবাদ। বিশ্বাস করুন বা না করুন, আমি 1, 0, -1এখানে জিজ্ঞাসা করার আগে আমি কোডের বিভিন্ন স্নিপেট ব্যবহার করেছিলাম। আমি কেবল আমার প্রয়োজনীয় তথ্যটি খুঁজে পাচ্ছিলাম না।
ক্রিস

48

প্রোটোটাইপ উত্তরাধিকার ব্যবহার করে এই সমস্যার সহজ এবং দ্রুত সমাধান:

Array.prototype.sortBy = function(p) {
  return this.slice(0).sort(function(a,b) {
    return (a[p] > b[p]) ? 1 : (a[p] < b[p]) ? -1 : 0;
  });
}

উদাহরণ / ব্যবহার

objs = [{age:44,name:'vinay'},{age:24,name:'deepak'},{age:74,name:'suresh'}];

objs.sortBy('age');
// Returns
// [{"age":24,"name":"deepak"},{"age":44,"name":"vinay"},{"age":74,"name":"suresh"}]

objs.sortBy('name');
// Returns
// [{"age":24,"name":"deepak"},{"age":74,"name":"suresh"},{"age":44,"name":"vinay"}]

আপডেট: আর অরিজিনাল অ্যারে পরিবর্তন করে না।


5
এটি আর একটি অ্যারে ফিরিয়ে দেয় না। তবে প্রকৃতপক্ষে মূলটি সাজায়!
বিনয় আগরওয়াল

আপনি যদি নিশ্চিত করতে চান যে আপনি সংখ্যার সাথে একটি প্রাকৃতিক বাছাই করছেন (যেমন, 0,1,2,10,11 ইত্যাদি ...) রেডিক্স সেট সহ পার্সইন্ট ব্যবহার করুন। বিকাশকারী.মোজিলা.আর.ইন- ইউএস / ডকস / ওয়েবে / জাভা স্ক্রিপ্ট / রেফারেন্স / so তো: ফিরে (পার্সেন্ট (এ [পি], ১০)) পার্সেন্ট (বি [পি], ১০))? 1: (parseInt (a [p], 10) <parseInt (b [p], 10))? -1: 0;
পল

@ কোডেহেন্টার এটি সংশোধন করার জন্য ধন্যবাদ। তবে আমার ধারণা এই সংবেদনশীলকরণটি করার জন্য বাছাইয়ের ফাংশন করার পরিবর্তে, যদি আমরা ডেটা টাইপগুলি ঠিক করতে একটি পৃথক ফাংশন করি তবে এটি আরও ভাল। কারন সাজানোর ক্রিয়াকলাপটি কোন সম্পত্তিতে কী ধরণের ডেটা থাকবে তা বলতে পারে না। :)
বিনয় আগরওয়াল

খুব সুন্দর. Asc / desc প্রভাব পেতে তীরগুলি বিপরীত করুন।
আব্দুল সাদিক ইয়ালসিন

4
কখনই না, এমন কোনও সমাধানের প্রস্তাব দিন যা কোনও মূল অবজেক্টের প্রোটোটাইপ পরিবর্তন করে
pbanka

39

2018 এর হিসাবে এখানে আরও খাটো এবং মার্জিত সমাধান রয়েছে। শুধু ব্যবহার। অ্যারে.প্রোটোটাইপ.সোর্ট ()

উদাহরণ:

var items = [
  { name: 'Edward', value: 21 },
  { name: 'Sharpe', value: 37 },
  { name: 'And', value: 45 },
  { name: 'The', value: -12 },
  { name: 'Magnetic', value: 13 },
  { name: 'Zeros', value: 37 }
];

// sort by value
items.sort(function (a, b) {
  return a.value - b.value;
});

7
প্রশ্নের মধ্যে স্ট্রিংগুলি সংখ্যার বিপরীতে তুলনার জন্য ব্যবহৃত হত। আপনার উত্তর সংখ্যা অনুসারে বাছাই করার জন্য দুর্দান্ত কাজ করে তবে স্ট্রিংয়ের সাথে তুলনা করার পক্ষে এটি খুব ভাল নয়।
smcstewart

a.value - b.valueবস্তুর বৈশিষ্ট্যাবলী (তুলনা করতে ব্যবহৃত সংখ্যার এই ক্ষেত্রে) ডেটা বিভিন্ন বার জন্য গৃহীত হতে পারে। উদাহরণস্বরূপ, প্রতিবেশী স্ট্রিংগুলির প্রতিটি জুটির তুলনা করতে রেজেক্স ব্যবহার করা যেতে পারে ।
0leg

1
@ 0leg আমি এই পদ্ধতিতে স্ট্রিংগুলির তুলনা করতে রেজেক্স ব্যবহারের উদাহরণ দেখতে চাই।
বব স্টেইন

আপনি যদি আইডির মাধ্যমে বাছাই করতে চান তবে এই বাস্তবায়নটি বেশ ভাল। হ্যাঁ, আপনি প্রতিবেশী স্ট্রিংয়ের তুলনা করার জন্য রেজেক্স ব্যবহার করার পরামর্শ দিয়েছেন যা সমাধানটিকে আরও জটিল করে তোলে তবে সরল সংস্করণের উদ্দেশ্য অন্যথায় হবে যদি প্রদত্ত সমাধানের সাথে রেজেক্স ব্যবহার করা হয়। সরলতা সবচেয়ে ভাল।
সুরেন্দ্রপান্ডে

33

পুরানো উত্তর যা সঠিক নয়:

arr.sort((a, b) => a.name > b.name)

হালনাগাদ

বিউচ্যাম্পের মন্তব্য থেকে:

arr.sort((a, b) => a.name < b.name ? -1 : (a.name > b.name ? 1 : 0))

আরও পঠনযোগ্য ফর্ম্যাট:

arr.sort((a, b) => {
  if (a.name < b.name) return -1
  return a.name > b.name ? 1 : 0
})

নেস্টেড টেরেনারি ছাড়া:

arr.sort((a, b) => a.name < b.name ? - 1 : Number(a.name > b.name))

ব্যাখ্যা: Number()কাস্ট trueকরা হবে 1এবং falseকরতে 0


এটি কাজ করে, তবে ফলাফলটি কোনও কারণে অস্থির
টাইটানফাইটার

@ AO17 না এটি হবে না। আপনি স্ট্রিং বিয়োগ করতে পারবেন না।
প্যাট্রিক রবার্টস

15
এটি করা উচিত:arr.sort((a, b) => a.name < b.name ? -1 : (a.name > b.name ? 1 : 0))
জিন-ফ্রান্সোইস বিউচাম্প

3
@ জিন-ফ্রেঞ্চোইস বিউচ্যাম্প, আপনার সমাধানটি পুরোপুরি সূক্ষ্ম এবং আরও ভাল কাজ করে।
আহসান

সংখ্যা সহ তৃতীয়টি সোজা এবং সুন্দর!
কোজো

29

কাস্টম তুলনা ফাংশনটি ব্যবহার করার পরিবর্তে, আপনি কাস্টম toString()পদ্ধতিতে একটি অবজেক্ট টাইপও তৈরি করতে পারেন (যা ডিফল্ট তুলনা ফাংশন দ্বারা আহবান করা হয়েছে):

function Person(firstName, lastName) {
    this.firtName = firstName;
    this.lastName = lastName;
}

Person.prototype.toString = function() {
    return this.lastName + ', ' + this.firstName;
}

var persons = [ new Person('Lazslo', 'Jamf'), ...]
persons.sort();

29

Lodash.js (এর সুপারসেটও Underscore.js )

প্রতিটি সহজ যুক্তির জন্য কাঠামো যুক্ত না করা ভাল, তবে ভাল পরীক্ষিত ইউটিলিটি ফ্রেমওয়ার্কগুলিতে নির্ভর করা বিকাশকে গতি বাড়িয়ে তুলতে পারে এবং বাগের পরিমাণ হ্রাস করতে পারে।

লোডাশ খুব পরিষ্কার কোড তৈরি করে এবং আরও কার্যকরী প্রোগ্রামিং শৈলীর প্রচার করে । কোডের উদ্দেশ্য কী তা এক ঝলক পরিষ্কার হয়ে যায়।

ওপির সমস্যাটি কেবল এ হিসাবে সমাধান করা যেতে পারে:

const sortedObjs = _.sortBy(objs, 'last_nom');

অধিক তথ্য? উদাহরণস্বরূপ আমরা নেস্টেড অবজেক্টটি অনুসরণ করেছি:

const users = [
  { 'user': {'name':'fred', 'age': 48}},
  { 'user': {'name':'barney', 'age': 36 }},
  { 'user': {'name':'wilma'}},
  { 'user': {'name':'betty', 'age': 32}}
];

আমরা এখন _.প্রপার্টি শর্টহ্যান্ড ব্যবহার করতে পারিuser.age যে সম্পত্তির সাথে মিল থাকা উচিত specify আমরা নেস্টেড বয়সের সম্পত্তি অনুসারে ব্যবহারকারীর বিষয়গুলিকে বাছাই করব। হ্যাঁ, এটি নেস্টেড সম্পত্তি মিলে যাওয়ার অনুমতি দেয়!

const sortedObjs = _.sortBy(users, ['user.age']);

এটি বিপরীত চান? সমস্যা নেই. _ . রিভার্স ব্যবহার করুন ।

const sortedObjs = _.reverse(_.sortBy(users, ['user.age']));

চেইন ব্যবহার করে উভয়কে একত্রিত করতে চান ?

const { chain } = require('lodash');
const sortedObjs = chain(users).sortBy('user.age').reverse().value();

অথবা আপনি কখন প্রবাহকে পছন্দ করেন চেইন ওভার করেন?

const { flow, reverse, sortBy } = require('lodash/fp');
const sortedObjs = flow([sortBy('user.age'), reverse])(users); 

28

তুমি ব্যবহার করতে পার

সহজ রাস্তা: লোডাশ

( https://lodash.com/docs/4.17.10#orderBy )

এই পদ্ধতিটি _.সোর্টবাইয়ের মতো এটি ব্যতীত এটি পুনরাবৃত্তির ক্রম ক্রম অনুসারে সাজানোর ক্রমটি নির্দিষ্ট করে। যদি আদেশগুলি অনির্দিষ্ট করা থাকে তবে সমস্ত মানগুলি ক্রমবর্ধমান ক্রমে সাজানো হয়। অন্যথায়, উত্থানের জন্য "desc" বা সংশ্লিষ্ট মানের মান অনুসারে বাছাইয়ের জন্য "asc" অর্ডার নির্দিষ্ট করুন specify

যুক্তি

সংগ্রহ (অ্যারে | অবজেক্ট): পুনরাবৃত্তি করতে সংগ্রহ। [পুনরাবৃত্তি = [_। পরিচয়]] (অ্যারে [] | ফাংশন [] | অবজেক্ট [] | স্ট্রিং []): অনুসারে সাজানো পুনরুক্তি। [আদেশ] (স্ট্রিং []): পুনরাবৃত্তির সাজানোর ক্রম।

রিটার্নস

(অ্যারে): নতুন সাজানো অ্যারে প্রদান করে।


var _ = require('lodash');
var homes = [
    {"h_id":"3",
     "city":"Dallas",
     "state":"TX",
     "zip":"75201",
     "price":"162500"},
    {"h_id":"4",
     "city":"Bevery Hills",
     "state":"CA",
     "zip":"90210",
     "price":"319250"},
    {"h_id":"6",
     "city":"Dallas",
     "state":"TX",
     "zip":"75000",
     "price":"556699"},
    {"h_id":"5",
     "city":"New York",
     "state":"NY",
     "zip":"00010",
     "price":"962500"}
    ];

_.orderBy(homes, ['city', 'state', 'zip'], ['asc', 'desc', 'asc']);

23

এখানে অনেক ভাল উত্তর রয়েছে, তবে আমি এটি উল্লেখ করতে চাই যে আরও জটিল জটিল বাছাইয়ের জন্য এগুলি খুব সহজভাবে বাড়ানো যেতে পারে। কেবলমাত্র আপনাকে যা করতে হবে তা হল অপারেটরটি এই জাতীয় তুলনামূলক ফাংশনগুলিকে চেইন করতে ব্যবহার করুন:

objs.sort((a,b)=> fn1(a,b) || fn2(a,b) || fn3(a,b) )

যেখানে fn1, fn2... ... হল সাজানোর ক্রিয়া যা [-1,0,1] ফিরে আসে। এর ফলে "fn1 দ্বারা বাছাই করা", "fn2 দ্বারা বাছাই করা" যা এসকিউএল এর অর্ডার দ্বারা বেশ সমান।

এই সমাধানটি ||অপারেটরের আচরণের উপর ভিত্তি করে যা প্রথম মূল্যায়িত এক্সপ্রেশনকে মূল্যায়ণ করে যা সত্যে রূপান্তরিত হতে পারে

সহজতম ফর্মটিতে এর মতো একটি মাত্র অন্তর্নিহিত ফাংশন রয়েছে:

// ORDER BY last_nom
objs.sort((a,b)=> a.last_nom.localeCompare(b.last_nom) )

এর সাথে দুটি পদক্ষেপ নেওয়া last_nom, first_nomসাজানোর ক্রমটি দেখতে এই রকম হবে:

// ORDER_BY last_nom, first_nom
objs.sort((a,b)=> a.last_nom.localeCompare(b.last_nom) || 
                  a.first_nom.localeCompare(b.first_nom)  )

একটি জেনেরিক তুলনা ফাংশন এরকম কিছু হতে পারে:

// ORDER BY <n>
let cmp = (a,b,n)=>a[n].localeCompare(b[n])

এই ক্ষেত্রটি সংখ্যাসূচক ক্ষেত্র, কেস সংবেদনশীলতা, সালিসী ডেটাটাইপস ইত্যাদিকে সমর্থন করার জন্য বাড়ানো যেতে পারে

আপনি এগুলি এটিকে শৃঙ্খলাবদ্ধ অগ্রাধিকারের দ্বারা শৃঙ্খলাবদ্ধ করে ব্যবহার করতে পারেন:

// ORDER_BY last_nom, first_nom
objs.sort((a,b)=> cmp(a,b, "last_nom") || cmp(a,b, "first_nom") )
// ORDER_BY last_nom, first_nom DESC
objs.sort((a,b)=> cmp(a,b, "last_nom") || -cmp(a,b, "first_nom") )
// ORDER_BY last_nom DESC, first_nom DESC
objs.sort((a,b)=> -cmp(a,b, "last_nom") || -cmp(a,b, "first_nom") )

এখানে মূল বিষয়টি হ'ল কার্যক্ষম পদ্ধতির সাথে খাঁটি জাভাস্ক্রিপ্ট আপনাকে বাহ্যিক লাইব্রেরি বা জটিল কোড ছাড়াই দীর্ঘ পথ যেতে পারে। এটিও খুব কার্যকর, যেহেতু কোনও স্ট্রিং পার্সিং করতে হয় না


23

ব্যবহারের উদাহরণ:

objs.sort(sortBy('last_nom'));

লিপি:

/**
 * @description
 * Returns a function which will sort an
 * array of objects by the given key.
 *
 * @param  {String}  key
 * @param  {Boolean} reverse
 * @return {Function}
 */
const sortBy = (key, reverse) => {

  // Move smaller items towards the front
  // or back of the array depending on if
  // we want to sort the array in reverse
  // order or not.
  const moveSmaller = reverse ? 1 : -1;

  // Move larger items towards the front
  // or back of the array depending on if
  // we want to sort the array in reverse
  // order or not.
  const moveLarger = reverse ? -1 : 1;

  /**
   * @param  {*} a
   * @param  {*} b
   * @return {Number}
   */
  return (a, b) => {
    if (a[key] < b[key]) {
      return moveSmaller;
    }
    if (a[key] > b[key]) {
      return moveLarger;
    }
    return 0;
  };
};

এটি ভেঙে দেওয়ার জন্য আপনাকে ধন্যবাদ, আমি বুঝতে চেষ্টা করছি কেন 1, 0, -1বাছাই ক্রমের জন্য অঙ্কগুলি কেন ব্যবহৃত হয়। এমনকি উপরে আপনার ব্যাখ্যা সহ যা দেখতে খুব সুন্দর দেখাচ্ছে - আমি এখনও এটি বেশ বুঝতে পারি না। আমি সর্বদা -1অ্যারের দৈর্ঘ্যের বৈশিষ্ট্যটি ব্যবহার করার সময় হিসাবে ভাবি ie arr.length = -1অর্থ : আইটেমটি পাওয়া যায় নি। আমি সম্ভবত এখানে জিনিসগুলি মিশ্রিত করছি, তবে আপনি কি আমাকে বুঝতে সাহায্য করতে পারেন যে অঙ্কগুলি 1, 0, -1অর্ডার নির্ধারণের জন্য কেন ব্যবহৃত হয়? ধন্যবাদ।
ক্রিস

1
এটি সম্পূর্ণ সঠিক নয় তবে এটি এটির মতো ভাবতে সহায়তা করতে পারে: ফাংশনটি অ্যারেতে চলে গেছে ort অ্যারেটিতে প্রতিটি আইটেমের জন্য একবার "আ" নামক যুক্তি হিসাবে ডাকা হয় ort প্রতিটি ফাংশন কলের রিটার্ন মান হ'ল পরবর্তী আইটেম "বি" এর তুলনায় আইটেম "এ" এর সূচক (বর্তমান অবস্থান নম্বর) কীভাবে পরিবর্তন করা উচিত। সূচক অ্যারের ক্রমটি নির্দেশ করে (0, 1, 2 ইত্যাদি) সুতরাং "ক" যদি সূচক 5 এ থাকে এবং আপনি -1 ফিরে আসেন তবে 5 + -1 == 4 (এটি সামনে এগিয়ে যান) 5 + 0 == 5 (এটি যেখানে রয়েছে সেখানে রাখুন) ইত্যাদি It এটি প্রতিটি পর্যায়ে পৌঁছানো অবধি প্রতিবার 2 টি প্রতিবেশীর সাথে তুলনা করে অ্যারে চলে,
জ্যামি ম্যাসন

এই আরও ব্যাখ্যা করতে সময় দেওয়ার জন্য আপনাকে ধন্যবাদ। সুতরাং আপনার ব্যাখ্যা এবং MDN অ্যারে.প্রোটোটাইপ.সোর্টটি ব্যবহার করে আমি আপনাকে বলব যে আমি এটি সম্পর্কে কী ভাবছি: তুলনায় aএবং b, যদি সূচকে 1 যোগ করার aচেয়ে bবেশি হয় aএবং পিছনে রাখুন b, যদি এর aচেয়ে কম হয় b, 1 থেকে বিয়োগ করে aএটিকে সামনে রাখুন b। যদি aএবং bএকই হয় তবে 0 যুক্ত করুন aএবং এটি যেখানে রেখে দিন।
ক্রিস

22

আমি এই বিশেষ পরামর্শ দেওয়া পদ্ধতির দেখা যায় না, তাই এখানে একটি বাহুল্যবর্জিত তুলনা পদ্ধতি আমি উভয় জন্য যে কাজ ব্যবহার করতে চান এর stringএবং number:

const objs = [ 
  { first_nom: 'Lazslo', last_nom: 'Jamf'     },
  { first_nom: 'Pig',    last_nom: 'Bodine'   },
  { first_nom: 'Pirate', last_nom: 'Prentice' }
];

const sortBy = fn => (a, b) => {
  const fa = fn(a);
  const fb = fn(b);
  return -(fa < fb) || +(fa > fb);
};

const getLastName = o => o.last_nom;
const sortByLastName = sortBy(getLastName);

objs.sort(sortByLastName);
console.log(objs.map(getLastName));

এখানে একটি ব্যাখ্যা sortBy():

sortBy()fnএমন একটি গ্রহণ করে যা তুলনা হিসাবে ব্যবহার করতে কোনও বস্তু থেকে কোন মান নির্বাচন করে এবং এমন কোনও ফাংশন প্রদান করে যা সরাসরি চলে যেতে পারে Array.prototype.sort()। এই উদাহরণে, আমরা ব্যবহার করছি o.last_nomতুলনা জন্য মান হিসাবে, তাই আমরা মাধ্যমে দুটি বস্তুর গ্রহণ যখনই Array.prototype.sort()যেমন

{ first_nom: 'Lazslo', last_nom: 'Jamf' }

এবং

{ first_nom: 'Pig', last_nom: 'Bodine' }

আমরা ব্যাবহার করি

(a, b) => {
  const fa = fn(a);
  const fb = fn(b);
  return -(fa < fb) || +(fa > fb);
};

তাদের তুলনা।

মনে আছে fn = o => o.last_nom, আমরা তুলনা ফাংশন সমতুল্য প্রসারিত করতে পারেন

(a, b) => {
  const fa = a.last_nom;
  const fb = b.last_nom;
  return -(fa < fb) || +(fa > fb);
};

লজিকাল ওআর ||অপারেটরের একটি শর্ট সার্কিট কার্যকারিতা রয়েছে যা এখানে খুব দরকারী। এটি কীভাবে কাজ করে তার কারণে উপরের ক্রিয়াকলাপটির মূল অর্থ

if (fa < fb) return -1;
if (fa > fb) return 1;
return 0;

একটি যুক্ত বোনাস হিসাবে, এখানে তীর ফাংশন ছাড়াই ECMAScript 5 এর সমতুল্য, যা দুর্ভাগ্যক্রমে আরও ভার্জোজ:

var objs = [ 
  { first_nom: 'Lazslo', last_nom: 'Jamf'     },
  { first_nom: 'Pig',    last_nom: 'Bodine'   },
  { first_nom: 'Pirate', last_nom: 'Prentice' }
];

var sortBy = function (fn) {
  return function (a, b) {
    var fa = fn(a);
    var fb = fn(b);
    return -(fa < fb) || +(fa > fb);
  };
};

var getLastName = function (o) { return o.last_nom };
var sortByLastName = sortBy(getLastName);

objs.sort(sortByLastName);
console.log(objs.map(getLastName));


17

আমি জানি এই প্রশ্নটি অনেক পুরানো, তবে আমি আমার মতো কোনও বাস্তবায়ন দেখিনি।
এই সংস্করণটি শোয়ার্টজিয়ান রূপান্তর আইডিয়ামের উপর ভিত্তি করে ।

function sortByAttribute(array, ...attrs) {
  // generate an array of predicate-objects contains
  // property getter, and descending indicator
  let predicates = attrs.map(pred => {
    let descending = pred.charAt(0) === '-' ? -1 : 1;
    pred = pred.replace(/^-/, '');
    return {
      getter: o => o[pred],
      descend: descending
    };
  });
  // schwartzian transform idiom implementation. aka: "decorate-sort-undecorate"
  return array.map(item => {
    return {
      src: item,
      compareValues: predicates.map(predicate => predicate.getter(item))
    };
  })
  .sort((o1, o2) => {
    let i = -1, result = 0;
    while (++i < predicates.length) {
      if (o1.compareValues[i] < o2.compareValues[i]) result = -1;
      if (o1.compareValues[i] > o2.compareValues[i]) result = 1;
      if (result *= predicates[i].descend) break;
    }
    return result;
  })
  .map(item => item.src);
}

এটি কীভাবে ব্যবহার করবেন তা এখানে একটি উদাহরণ:

let games = [
  { name: 'Mashraki',          rating: 4.21 },
  { name: 'Hill Climb Racing', rating: 3.88 },
  { name: 'Angry Birds Space', rating: 3.88 },
  { name: 'Badland',           rating: 4.33 }
];

// sort by one attribute
console.log(sortByAttribute(games, 'name'));
// sort by mupltiple attributes
console.log(sortByAttribute(games, '-rating', 'name'));

14

অবজেক্টগুলির জটিল অ্যারে বাছাই করা (আরও)

যেহেতু আপনি সম্ভবত এই অ্যারের মতো আরও জটিল ডেটা স্ট্রাকচারের মুখোমুখি হচ্ছেন, তাই আমি সমাধানটি প্রসারিত করব।

টি এল; ডিআর

@ ইজ-ইজকানের খুব সুন্দর উত্তরের উপর ভিত্তি করে আরও প্লাগযোগ্য সংস্করণ ।

সমস্যা

আমি নীচের মুখোমুখি হয়েছি এবং এটি পরিবর্তন করতে পারিনি। আমিও সাময়িকভাবে বস্তুটি চাটুকার করতে চাইনি। না আমি আন্ডারস্কোর / লোডাশ ব্যবহার করতে চাইনি, প্রধানত পারফরম্যান্সের কারণে এবং এটিকে নিজে প্রয়োগ করার মজাদার জন্য।

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;
  }
}

উদাহরণ

জেএসবিনে কাজের উদাহরণ


2
কেন? এটি আসল প্রশ্নের উত্তর নয় এবং "লক্ষ্য" কেবল পিপলস.সোর্ট ((ক, বি) => {রিটার্ন এ.নেম.নেম.লোকেলকম্পার (b.Name.name) দিয়ে সমাধান করা যেতে পারে || a.Name .surname.localeCompare (b.Name.surname)})
টেরো টলোনেন

12

আরও একটি বিকল্প:

var someArray = [...];

function generateSortFn(prop, reverse) {
    return function (a, b) {
        if (a[prop] < b[prop]) return reverse ? 1 : -1;
        if (a[prop] > b[prop]) return reverse ? -1 : 1;
        return 0;
    };
}

someArray.sort(generateSortFn('name', true));

ডিফল্টরূপে আরোহী বাছাই।


1
: সামান্য সংস্করণ একাধিক ক্ষেত্র দ্বারা বাছাইয়ের জন্য করা হয় এখানে পরিবর্তিত প্রয়োজনে stackoverflow.com/questions/6913512/...
Ravshan Samandarov

দেখে মনে হচ্ছে এটি পরেরটি হতে পারে: এক্সপোর্ট ফাংশন জেনারেটসোর্টফএন (প্রোপ: স্ট্রিং, বিপরীত: বুলেটিয়ান = মিথ্যা): (... আরগস: কোনও) => সংখ্যা {রিটার্ন (এ, বি) => {রিটার্ন একটি [প্রোপ ] <বি [প্রপ]? বিপরীত? 1: -1: ক [প্রপ]> খ [প্রপ]? বিপরীত? -1: 1: 0; }; }
ডেন কেরেনি

আমি সংক্ষিপ্ততম কোডটির চেয়ে বেশি পঠনযোগ্য কোডটি পছন্দ করব।
রাবশান সমান্ডারভ

সম্মত, তবে কিছু ক্ষেত্রে আমার ইউটিলিটি ফাংশনগুলি দেখার প্রয়োজন হয়নি।
ডেন কের্নি

11

একটি সাধারণ ফাংশন যা কোনও সম্পত্তি দ্বারা বস্তুর অ্যারে বাছাই করে

function sortArray(array, property, direction) {
    direction = direction || 1;
    array.sort(function compare(a, b) {
        let comparison = 0;
        if (a[property] > b[property]) {
            comparison = 1 * direction;
        } else if (a[property] < b[property]) {
            comparison = -1 * direction;
        }
        return comparison;
    });
    return array; // Chainable
}

ব্যবহার:

var objs = [ 
    { first_nom: 'Lazslo', last_nom: 'Jamf'     },
    { first_nom: 'Pig',    last_nom: 'Bodine'   },
    { first_nom: 'Pirate', last_nom: 'Prentice' }
];

sortArray(objs, "last_nom"); // Asc
sortArray(objs, "last_nom", -1); // Desc

দ্বি-দিকনির্দেশকে বাছাই করার জন্য এই সমাধানটি আমার পক্ষে নিখুঁতভাবে কাজ করেছে। আপনাকে ধন্যবাদ
মঞ্জুব্রেডি

10

একটি সহজ উপায়:

objs.sort(function(a,b) {
  return b.last_nom.toLowerCase() < a.last_nom.toLowerCase();
});

'.toLowerCase()'স্ট্রিংগুলির সাথে তুলনা করার ক্ষেত্রে এরোগুলি রোধ করার জন্য এটি প্রয়োজনীয় See


4
objs.sort( (a,b) => b.last_nom.toLowerCase() < a.last_nom.toLowerCase() );
কোডটিকে

এখানে বর্ণিত একই কারণে এটি ভুল ।
প্যাট্রিক রবার্টস 9

2
তীর ফাংশনগুলি ES5- যোগ্য নয়। টন ইঞ্জিনগুলি এখনও ইএস 5 এর মধ্যে সীমাবদ্ধ। আমার ক্ষেত্রে, আমি উত্তরটি উল্লেখযোগ্যভাবে আরও ভালভাবে পেয়েছি যেহেতু আমি
ইএস

9

এজ ইজকান কোডের জন্য অতিরিক্ত ডেস্ক প্যারাম

function dynamicSort(property, desc) {
    if (desc) {
        return function (a, b) {
            return (a[property] > b[property]) ? -1 : (a[property] < b[property]) ? 1 : 0;
        }   
    }
    return function (a, b) {
        return (a[property] < b[property]) ? -1 : (a[property] > b[property]) ? 1 : 0;
    }
}

9

বিনয়ের ধারণার সাথে এজের গতিশীল সমাধানের সংমিশ্রণ, আপনি একটি দুর্দান্ত দৃ solution় সমাধান পাবেন:

Array.prototype.sortBy = function() {
    function _sortByAttr(attr) {
        var sortOrder = 1;
        if (attr[0] == "-") {
            sortOrder = -1;
            attr = attr.substr(1);
        }
        return function(a, b) {
            var result = (a[attr] < b[attr]) ? -1 : (a[attr] > b[attr]) ? 1 : 0;
            return result * sortOrder;
        }
    }
    function _getSortFunc() {
        if (arguments.length == 0) {
            throw "Zero length arguments not allowed for Array.sortBy()";
        }
        var args = arguments;
        return function(a, b) {
            for (var result = 0, i = 0; result == 0 && i < args.length; i++) {
                result = _sortByAttr(args[i])(a, b);
            }
            return result;
        }
    }
    return this.sort(_getSortFunc.apply(null, arguments));
}

ব্যবহার:

// Utility for printing objects
Array.prototype.print = function(title) {
    console.log("************************************************************************");
    console.log("**** "+title);
    console.log("************************************************************************");
    for (var i = 0; i < this.length; i++) {
        console.log("Name: "+this[i].FirstName, this[i].LastName, "Age: "+this[i].Age);
    }
}

// Setup sample data
var arrObj = [
    {FirstName: "Zach", LastName: "Emergency", Age: 35},
    {FirstName: "Nancy", LastName: "Nurse", Age: 27},
    {FirstName: "Ethel", LastName: "Emergency", Age: 42},
    {FirstName: "Nina", LastName: "Nurse", Age: 48},
    {FirstName: "Anthony", LastName: "Emergency", Age: 44},
    {FirstName: "Nina", LastName: "Nurse", Age: 32},
    {FirstName: "Ed", LastName: "Emergency", Age: 28},
    {FirstName: "Peter", LastName: "Physician", Age: 58},
    {FirstName: "Al", LastName: "Emergency", Age: 51},
    {FirstName: "Ruth", LastName: "Registration", Age: 62},
    {FirstName: "Ed", LastName: "Emergency", Age: 38},
    {FirstName: "Tammy", LastName: "Triage", Age: 29},
    {FirstName: "Alan", LastName: "Emergency", Age: 60},
    {FirstName: "Nina", LastName: "Nurse", Age: 54}
];

//Unit Tests
arrObj.sortBy("LastName").print("LastName Ascending");
arrObj.sortBy("-LastName").print("LastName Descending");
arrObj.sortBy("LastName", "FirstName", "-Age").print("LastName Ascending, FirstName Ascending, Age Descending");
arrObj.sortBy("-FirstName", "Age").print("FirstName Descending, Age Ascending");
arrObj.sortBy("-Age").print("Age Descending");

1
ধারণার জন্য ধন্যবাদ! যাইহোক, দয়া করে লোকেদের অ্যারে প্রোটোটাইপ পরিবর্তন করতে উত্সাহিত করবেন না (আমার উদাহরণের শেষে সতর্কতাটি দেখুন)।
ইজ canস্কান

8

আপনার উদাহরণটি অনুসারে আপনাকে দুটি ক্ষেত্র (শেষ নাম, প্রথম নাম) বাছাই করতে হবে, তারপরে একটি করে। এই লাইনটিকে এক লাইনে তৈরি করতে আপনি আলাসকল লাইব্রেরি ব্যবহার করতে পারেন :

var res = alasql('SELECT * FROM ? ORDER BY last_nom, first_nom',[objs]);

JsFizz এ এই উদাহরণ চেষ্টা করুন ।


8
objs.sort(function(a,b){return b.last_nom>a.last_nom})

1
আসলে এটি কাজ করে বলে মনে হচ্ছে না, গ্রহণযোগ্য উত্তরটি ব্যবহার করতে হবে। এটি সঠিকভাবে বাছাই করা হয়নি।
ম্যাডপ্রপস

8

মূল উদাহরণ দেওয়া:

var objs = [ 
    { first_nom: 'Lazslo', last_nom: 'Jamf'     },
    { first_nom: 'Pig',    last_nom: 'Bodine'   },
    { first_nom: 'Pirate', last_nom: 'Prentice' }
];

একাধিক ক্ষেত্র অনুসারে বাছাই করুন:

objs.sort(function(left, right) {
    var last_nom_order = left.last_nom.localeCompare(right.last_nom);
    var first_nom_order = left.first_nom.localeCompare(right.first_nom);
    return last_nom_order || first_nom_order;
});

মন্তব্য

  • a.localeCompare(b)হয় সর্বজনীন সমর্থিত এবং আয় -1,0,1 যদি a<b, a==b, a>bযথাক্রমে।
  • ||শেষ লাইনে last_nomঅগ্রাধিকার দেয় first_nom
  • সংক্ষিপ্ত ক্ষেত্রগুলিতে বিয়োগ কাজ করে: var age_order = left.age - right.age;
  • বিপরীত অর্ডার নেতিবাচক, return -last_nom_order || -first_nom_order || -age_order;

7

বিভ্রান্তি থেকে রক্ষা পেতে আপনার এগুলিকে নিম্ন কেসে রূপান্তর করতে হবে।

objs.sort(function (a,b) {

var nameA=a.last_nom.toLowerCase(), nameB=b.last_nom.toLowerCase()

if (nameA < nameB)
  return -1;
if (nameA > nameB)
  return 1;
return 0;  //no sorting

})

7
function compare(propName) {
    return function(a,b) {
        if (a[propName] < b[propName])
            return -1;
        if (a[propName] > b[propName])
            return 1;
        return 0;
    };
}

objs.sort(compare("last_nom"));

1
আপনার কোডটি কী করে এবং কেন এটি সমস্যার সমাধান করবে সে সম্পর্কে আরও ব্যাখ্যা যুক্ত করতে আপনার পোস্টটি সম্পাদনা করার বিষয়টি বিবেচনা করুন। একটি উত্তর যা বেশিরভাগ সবে কোড থাকে (এমনকি এটি কাজ করে) সাধারণত ওপিকে তাদের সমস্যা বুঝতে সাহায্য করবে।
ড্রেনমি

7

রামদা,

এনএমপি রামদা ইনস্টল করুন

import R from 'ramda'
var objs = [ 
    { first_nom: 'Lazslo', last_nom: 'Jamf'     },
    { first_nom: 'Pig',    last_nom: 'Bodine'   },
    { first_nom: 'Pirate', last_nom: 'Prentice' }
];
var ascendingSortedObjs = R.sortBy(R.prop('last_nom'), objs)
var descendingSortedObjs = R.reverse(ascendingSortedObjs)

7

এটা চেষ্টা কর,

UPTO ES5

//Ascending Sort
items.sort(function (a, b) {
   return a.value - b.value;
});


//Descending Sort
items.sort(function (a, b) {
   return b.value - a.value;
});


IN ES6 & above:

// Ascending sort
items.sort((a, b) => a.value - b.value);

// Descending Sort
 items.sort((a, b) => b.value - a.value);

সেরা এবং সহজ সমাধান
ওমর হাসান

6

এটি একটি সাধারণ সমস্যা, জানেন না কেন মানুষের এমন জটিল সমাধান রয়েছে।
একটি সাধারণ সাজানোর কার্য ( দ্রুত সাজানোর অ্যালগরিদমের উপর ভিত্তি করে ):

function sortObjectsArray(objectsArray, sortKey)
        {
            // Quick Sort:
            var retVal;

            if (1 < objectsArray.length)
            {
                var pivotIndex = Math.floor((objectsArray.length - 1) / 2);  // middle index
                var pivotItem = objectsArray[pivotIndex];                    // value in the middle index
                var less = [], more = [];

                objectsArray.splice(pivotIndex, 1);                          // remove the item in the pivot position
                objectsArray.forEach(function(value, index, array)
                {
                    value[sortKey] <= pivotItem[sortKey] ?                   // compare the 'sortKey' proiperty
                        less.push(value) :
                        more.push(value) ;
                });

                retVal = sortObjectsArray(less, sortKey).concat([pivotItem], sortObjectsArray(more, sortKey));
            }
            else
            {
                retVal = objectsArray;
            }

            return retVal;
        }

উদাহরণ ব্যবহার করুন:

var myArr = 
        [
            { val: 'x', idx: 3 },
            { val: 'y', idx: 2 },
            { val: 'z', idx: 5 },
        ];
myArr = sortObjectsArray(myArr, 'idx');

5
কীভাবে দ্রুত সমাধানের কার্যকর সমাধান করা যায় সাধারণ সমাধানের জন্য? সরল অ্যালগরিদম তবে একটি সহজ সমাধান নয়।
অ্যান্ড্রু

এটি সহজ যেহেতু এটি কোনও বাহ্যিক গ্রন্থাগার ব্যবহার করে না এবং এটি বস্তুর প্রোটোটাইপ পরিবর্তন করে না। আমার মতে, কোডের দৈর্ঘ্যের কোডের জটিলতায় সরাসরি প্রভাব ফেলবে না
গিল এপশেটেন

2
ঠিক আছে, আমাকে বিভিন্ন শব্দ দিয়ে চেষ্টা করতে দিন: চাকা পুনরায় উদ্দীপনা একটি সহজ সমাধান কিভাবে?
রবার্তো 14
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.