জাভাস্ক্রিপ্টে প্রথম নাম (বর্ণানুক্রমিক) অনুসারে অ্যারে সাজান ort


644

আমি একটি অ্যারে পেয়েছি (অ্যারেতে একটি অবজেক্টের জন্য নীচে দেখুন) যা জাভাস্ক্রিপ্ট ব্যবহার করে আমার প্রথম নাম অনুসারে বাছাই করা দরকার। আমি এটা কিভাবে করবো?

var user = {
   bio: null,
   email:  "user@domain.com",
   firstname: "Anna",
   id: 318,
   lastAvatar: null,
   lastMessage: null,
   lastname: "Nickson",
   nickname: "anny"
};

উত্তর:


1065

ধরুন আপনি একটি অ্যারে আছে users। আপনি ব্যবহার করতে পারেনusers.sort একটি ফাংশন এবং পাস যা দুটি আর্গুমেন্ট নেয় এবং তাদের তুলনা করে (তুলনামূলক)

এটা ফিরে আসা উচিত

  • নেতিবাচক কিছু যদি প্রথম যুক্তি দ্বিতীয় থেকে কম হয় (ফলাফলের অ্যারেতে দ্বিতীয়টির আগে স্থাপন করা উচিত)
  • প্রথম যুক্তি যদি বেশি হয় তবে ইতিবাচক কিছু (দ্বিতীয়টির পরে স্থাপন করা উচিত)
  • 0 যদি এই দুটি উপাদান সমান হয়।

আমাদের যদি দুটি উপাদান যদি aএবং bআমরা তুলনা করতে চান a.firstnameএবংb.firstname

উদাহরণ:

users.sort(function(a, b){
    if(a.firstname < b.firstname) { return -1; }
    if(a.firstname > b.firstname) { return 1; }
    return 0;
})

এই কোডটি কোনও প্রকারের সাথে কাজ করতে চলেছে।

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


5
ফ্রিগিন দুর্দান্ত ... আমি আইডি দ্বারা একটি নোডলিস্ট বাছাই করছি ... কবজির মতো কাজ করে। এক টন!
কোডি

74
পরবর্তী তারিখে যারা আসবেন তাদের ক্ষেত্রে মিঃচিফের উত্তরটি আরও ভাল কারণ এটি ক্ষেত্রে সংবেদনশীল।
মিলিওনো

25
@ মিলিয়েনু, আমি এটিকে আরও ভাল বা খারাপ বলব না। এটি আর একটি
রিয়াড

19
@ রিয়াড ফেয়ার যথেষ্ট। বর্ণানুক্রমিক আইটেমগুলি বর্ণনামূলকভাবে ক্যাসিং সহ অনেকগুলি ক্ষেত্রে বাছাইয়ের ক্ষেত্রে ভাবতে পারে না, যেখানে 'জেব্রা' তালিকায় 'আপেল' এর আগে উপস্থিত হয়, খুব দরকারী।
mlienau

15
এই কোডটি কেবল ইংরেজীভাষী দেশগুলিতে কাজ করবে। অন্যান্য দেশে আপনার সাথে ওভুনসেটিনের উত্তরটিlocaleCompare ব্যবহার করা উচিত ।
Spoike

538

ES6 এর সাথে সংক্ষিপ্ততম কোড!

users.sort((a, b) => a.firstname.localeCompare(b.firstname))

String.prototype.localeCompare () প্রাথমিক সমর্থন সর্বজনীন!


26
এখন পর্যন্ত সেরা উত্তরটি যদি আপনি 2017 এ থাকেন তবে
নাথনবীরেল

51
আপনি যদি 2018 এ থাকেন তবেও সেরা উত্তর;)
সাইমন

48
সম্ভবত 2019 এরও সেরা উত্তর হতে চলেছে।
আহমদ মালেকী

22
2020 হতে পারে? না না?
kspearrin

13
আহ, 2030 সালে পৃথিবী বন্যা এবং এটি কেবল পর্বতে কাজ করে।
স্টারফস

343

এটার মতো কিছু:

array.sort(function(a, b){
 var nameA=a.name.toLowerCase(), nameB=b.name.toLowerCase();
 if (nameA < nameB) //sort string ascending
  return -1;
 if (nameA > nameB)
  return 1;
 return 0; //default return value (no sorting)
});

43
স্ট্রিং 'টুএলওয়ারকেস ()' বাছাই করার সময় খুব গুরুত্বপূর্ণ - মূল অক্ষরগুলি আপনার বাছাইকে প্রভাবিত করতে পারে।
মার্জসকস

3
অন্য কেউ যদি অবলম্বন করছেন যে কীভাবে টাওয়ারক্যাসের প্রভাব পড়ে, এটি খুব বেশি নয়:'a'>'A' //true 'z'>'a' //true 'A'>'z' //false
সিম্পলজি

14
@ সিম্পলজি আমি যুক্তি দিয়ে বলছি যে আপনি এর জন্য creditণ দিচ্ছেন এর প্রভাব তার চেয়ে কিছুটা বেশি। উদাহরণস্বরূপ, গৃহীত উত্তরের মন্তব্যে যেমন বলা হয়েছে, আপনার সকার্ট ফাংশনটি স্ট্রিংয়ের 'Zebra'চেয়ে স্ট্রিংটিকে আরও বাছাই করবে কিনা তা জানা গুরুত্বপূর্ণ 'apple', আপনি যদি এটি ব্যবহার না করেন তবে এটি করবে .toLowerCase()
প্রিন্সটাইক 4'15

1
@ প্রিন্সটাইক হ্যাঁ এটি একটি ভাল কেস মানুষ। 'Z' < 'a' // trueএবং'z' < 'a' // false
সিম্পলজি

2
সমস্ত বৈধ পয়েন্ট এবং আমি বলব বাছাই করা সর্বদা একটি "এটি নির্ভর করে" ধরণের জিনিস। আপনি যদি নাম অনুসারে বাছাই করেন তবে কেস সংবেদনশীলতা কোনও বিষয় নয়। অন্যান্য ক্ষেত্রে এটি হতে পারে। নির্বিশেষে, আমি মনে করি যে একবার আপনি মূল ধারণাটি পেয়ে গেলে কারও নির্দিষ্ট পরিস্থিতির অবলম্বন করা কঠিন নয়।
মিঃচিফ

336

যদি তুলনা স্ট্রিং ইউনিকোড অক্ষর ধারণ আপনি ব্যবহার করতে পারেন localeCompareফাংশন এর Stringনিচের মত শ্রেণী:

users.sort(function(a,b){
    return a.firstname.localeCompare(b.firstname);
})

3
স্ট্রিং.লোক্যালকম্পিয়ার সাফারি এবং
আইআই

13
@ কর্সার এটি সমর্থিত, এটি কেবল দ্বিতীয় এবং তৃতীয় প্যারামিটার যা সমর্থিত নয়।
কোডার

6
@ কর্সআর উদাহরণে ব্যবহার সমস্ত বড় আইই ব্রাউজারগুলিতে সমর্থিত: ডেভেলপার.মোজিলা.আর.ইন- ইউএস / ডকস / ওয়েব / জাভা স্ক্রিপ্ট / রেফারেন্স / । লোকালকম্পার অ্যাকাউন্টের মূলধনকেও গ্রহণ করে, তাই আমি মনে করি এই বাস্তবায়নটিকে সর্বোত্তম অনুশীলন হিসাবে বিবেচনা করা উচিত।
ম্যাট জেনসেন

9
users.sort ((a, b) => a.firstname.localeCompare (b.firstname)) // শর্ট এন মিষ্টি ES6 সংস্করণ!
নচিকেতা

4
ট্যাঙ্ক ভাই। ES6 ব্যবহারেusers.sort((a, b) => a.name.localeCompare(b.name))
মোহাম্মাদ ইব্রাহিমি আভাল

32

দুর্দান্ত ছোট ES6 একটি লাইনার:

users.sort((a, b) => a.firstname !== b.firstname ? a.firstname < b.firstname ? -1 : 1 : 0);

2
এটি একটি অসম্পূর্ণ যেহেতু এটি সমান মানগুলি সঠিকভাবে পরিচালনা করে না।
কার্ল-জোহান সিজগ্রেন

1
অবশ্যই, এটি চিহ্নিত করার জন্য ধন্যবাদ, আমি মানগুলির সাথে মিলের জন্য একটি চেক যুক্ত করেছি
স্যাম লোগান

খারাপ না আমার ধারণা যদি আপনি সত্যিই এটি এক লাইনে চান, নেস্টেড
টেরিনারিগুলি

24

আমরা লোকালকম্পার ব্যবহার করতে পারি তবে মিথ্যা মানগুলির জন্য কীগুলিও পরীক্ষা করতে হবে

যদি একটি এন্ট্রিতে নাম হারিয়ে যায় তবে নীচের কোডটি কার্যকর করবে না।

obj.sort((a, b) => a.lname.localeCompare(b.lname))

সুতরাং আমাদের নীচের মত ভুয়া মান পরীক্ষা করতে হবে

let obj=[
{name:'john',lname:'doe',address:'Alaska'},
{name:'tom',lname:'hopes',address:'California'},
{name:'harry',address:'Texas'}
]
let field='lname';
console.log(obj.sort((a, b) => (a[field] || "").toString().localeCompare((b[field] || "").toString())));

অথবা

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

import sortBy from 'lodash/sortBy';
sortBy(obj,'name')

https://lodash.com/docs/4.17.5#sortBy


2
লোদাশ বেশ ঝরঝরে! এর আগে শুনিনি। দুর্দান্ত কাজ!
ডার্ক জান স্পিলেম্যান

15

আন্ডারস্কোরগুলি খুব সুন্দর _ _সোর্টবি ফাংশন সরবরাহ করে:

_.sortBy([{a:1},{a:3},{a:2}], "a")

বা আপনি একটি কাস্টম বাছাই ফাংশন ব্যবহার করতে পারেন:

_.sortBy([{a:"b"},{a:"c"},{a:"a"}], function(i) {return i.a.toLowerCase()})

2
দ্বিতীয় উদাহরণটি স্ট্রিংগুলি ফেরত জড়িত। না sortByসনাক্ত ফিরে মান স্ট্রিং এবং এইভাবে একটি বর্ণানুক্রমিক শ্রেণীবিভাজন সঞ্চালিত? ধন্যবাদ
সুপারজোজ

12

যদি আমরা বিশেষ অক্ষরগুলির সাথে নাম বা কিছু বাছাই করি, যেমন ñ বা áéíóú (স্প্যানিশ ভাষায় কমোনস) আমরা প্যারাম লোকেলগুলি ( এই ক্ষেত্রে স্প্যানিশের জন্য এস ) এবং এই জাতীয় বিকল্পগুলি ব্যবহার করতে পারি :

let user = [{'firstname': 'Az'},{'firstname': 'Áb'},{'firstname':'ay'},{'firstname': 'Ña'},{'firstname': 'Nz'},{'firstname': 'ny'}];


user.sort((a, b) => a.firstname.localeCompare(b.firstname, 'es', {sensitivity: 'base'}))


console.log(user)

থিসিয়াল লোকাল বিকল্পগুলি এখানে আইনা , এস (স্প্যানিশ), ডি (জার্মান), ফরাসী (ফরাসী ভাষায়) পাওয়া যাবে। সংবেদনশীলতা বেস সম্পর্কে :

কেবল বেস অক্ষরে পৃথক স্ট্রিংগুলি অসম হিসাবে তুলনা করে। উদাহরণ: a ≠ b, a = á, a = A


8

মূলত আপনি পদ্ধতি সাজানোর সাথে অ্যারে বাছাই করতে পারেন, তবে আপনি যদি বস্তুগুলিকে বাছাই করতে চান তবে আপনাকে অ্যারের পদ্ধতি বাছাই করতে ফাংশনটি পাস করতে হবে, সুতরাং আমি আপনাকে আপনার অ্যারে ব্যবহার করে একটি উদাহরণ দেব

user = [{
bio: "<null>",
email: "user@domain.com",
firstname: 'Anna',
id: 318,
"last_avatar": "<null>",
"last_message": "<null>",
lastname: 'Nickson',
nickname: 'anny'
},
{
bio: "<null>",
email: "user@domain.com",
firstname: 'Senad',
id: 318,
"last_avatar": "<null>",
"last_message": "<null>",
lastname: 'Nickson',
nickname: 'anny'
},
{
bio: "<null>",
email: "user@domain.com",
firstname: 'Muhamed',
id: 318,
"last_avatar": "<null>",
"last_message": "<null>",
lastname: 'Nickson',
nickname: 'anny'
}];

var ar = user.sort(function(a, b)
{
  var nA = a.firstname.toLowerCase();
  var nB = b.firstname.toLowerCase();

  if(nA < nB)
    return -1;
  else if(nA > nB)
    return 1;
 return 0;
});

কেন 0 শেষে ফিরে?
নোবিটা

=, যখন স্ট্রিং একই থাকে
সেনাদ মেইকিন

তবে সেক্ষেত্রে elseকি অপসারণ করা উচিত নয় ? অন্যথায় এটি return 0কখনই পঠিত হবে না
নোবিতা

2
এটি "অন্য" নয়, এটি "অন্যথায় যদি"
সেনাদ মেইকিন


8

আরও কমপ্যাক্ট স্বরলিপি:

user.sort(function(a, b){
    return a.firstname === b.firstname ? 0 : a.firstname < b.firstname ? -1 : 1;
})

এটি আরও কমপ্যাক্ট তবে এটির চুক্তি লঙ্ঘন করেছে: sign(f(a, b)) =-sign(f(b, a))(a = খ এর জন্য)
রিয়াড

3
প্রত্যাবর্তন সম্পূর্ণতার জন্য a.firstname == b.firstnameব্যবহার করা উচিত===
পুইউ

6

উভয় এবং ডিস্ক বাছাইয়ের জন্যও আপনি এটি ব্যবহার করতে পারেন: ধরুন আমাদের কাছে একটি পরিবর্তনশীল সোর্টটাইপ রয়েছে যা আপনার পছন্দসই আরোহী বাছাই করে বা সাজানো সাজানো নির্দিষ্ট করে:

 users.sort(function(a,b){
            return   sortType==="asc"? a.firstName.localeCompare( b.firstName): -( a.firstName.localeCompare(  b.firstName));
        })

5

একটি সাধারণ ক্রিয়াকলাপ নীচের মতো লেখা যেতে পারে

    function getSortedData(data, prop, isAsc) {
        return data.sort((a, b) => (a[prop] < b[prop] ? -1 : 1) * (isAsc ? 1 : -1));
   }

আপনি নীচের পরামিতি পাস করতে পারেন

  1. আপনি যে তথ্যটি বাছাই করতে চান
  2. এর দ্বারা ডেটাতে থাকা সম্পত্তিটি বাছাই করা উচিত
  3. শেষ প্যারামিটারটি বুলিয়ান টাইপের। আপনি আরোহণের মাধ্যমে বা আরোহণের মাধ্যমে বাছাই করতে চান কিনা তা এটি পরীক্ষা করে

4

চেষ্টা

users.sort((a,b)=> (a.firstname>b.firstname)*2-1)


2
বাছাই ফাংশন -1,0,1 ফিরে আসা উচিত। এটি কেবলমাত্র -1,1 প্রদান করে।
রাদু লুনকাসু

@ রাদু লুনকাসু - আপনি কি পরীক্ষার ডেটা (ব্যবহারকারী অ্যারে) সরবরাহ করতে পারবেন যা দেখায় যে উপরের সমাধানটি ভুল ফল দেয়? (যতদূর আমি জানি, শূন্যটি হারিয়ে যাওয়া কোনও সমস্যা নয়)
কামিল কিয়েসজেউসকি

তুলনা ফাংশন (ক, খ) যদি 0 দেয়, তবে একে অপরের সাথে সম্মানের সাথে একটি এবং বি অপরিবর্তিত রেখে দিন, তবে সমস্ত ভিন্ন উপাদানের সাথে সজ্জায় সাজানো হয়েছে।
রাদু লুঙ্কাসু


@ রডু লুনকাসু ঠিক আছে, তবে এই তথ্যগুলির অর্থ এই নয় যে শূন্য বাধ্যতামূলক। এটি দেখানোর সর্বোত্তম উপায় হ'ল ডেটা প্রস্তুত করা যা কার্যকর হয় না - তবে যতদূর আমি জানি এটি অসম্ভব - উদাহরণস্বরূপ[9,8,7,6,5,1,2,3].sort((a,b) => a<b ? -1 : 1)
কামিল কিয়েসজেউস্কি

3

আপনি এটি বস্তুর জন্য ব্যবহার করতে পারেন

transform(array: any[], field: string): any[] {
return array.sort((a, b) => a[field].toLowerCase() !== b[field].toLowerCase() ? a[field].toLowerCase() < b[field].toLowerCase() ? -1 : 1 : 0);}

2

সোজা কথায় আপনি এই পদ্ধতিটি ব্যবহার করতে পারেন

users.sort(function(a,b){return a.firstname < b.firstname ? -1 : 1});

1

আপনি অন্তর্নির্মিত অ্যারে পদ্ধতিটি ব্যবহার করতে পারেন - sort। এই পদ্ধতিটি প্যারাম হিসাবে একটি কলব্যাক পদ্ধতি গ্রহণ করে



    // custom sort function to be passed as param/callback to the Array's sort method
    function myCustomSort(a, b) {
        return (a.toLowerCase() > b.toLowerCase()) ? 1 : -1;
    }

    // Actual method to be called by entity that needs sorting feature
    function sortStrings() {
        var op = Array.prototype.sort.call(arguments, myCustomSort);
    }

    // Testing the implementation
    var sortedArray = sortStrings("Burger", "Mayo1", "Pizza", "boxes", "Apples", "Mayo");
    console.log(sortedArray); //["Apples", "boxes", "Burger", "Mayo", "Mayo1", "Pizza"]


এই কোডটি বোঝার জন্য কী পয়েন্টগুলি লক্ষ্য করা উচিত।

  1. এক্ষেত্রে কাস্টম পদ্ধতি, myCustomSort প্রতিটি উপাদান জোড়া (ইনপুট অ্যারে থেকে) তুলনা করার জন্য +1 বা -1 প্রদান করা উচিত।
  2. কাস্টম বাছাই কলব্যাক পদ্ধতিতে toLowerCase()/ ব্যবহার করুন toUpperCase()যাতে কেস পার্থক্যটি বাছাইয়ের প্রক্রিয়াটির নির্ভুলতাকে প্রভাবিত করে না।

আমি এটি যথেষ্ট ব্যাখ্যা পরিষ্কার আশা করি। আপনি যদি মনে করেন তবে নির্দ্বিধায় মন্তব্য করুন, আরও তথ্যের প্রয়োজন।

চিয়ার্স!


যথাযথ উত্তর নয় কারণ এটি কেবলমাত্র চেকের চেয়ে কম এবং বৃহত্তর সঞ্চালন করে না এবং সমান চেক করে না।
ইস্পাত মস্তিষ্ক

এটি ২০১১ সাল থেকে সেখানে বসে থাকা যে কোনও জবাবের তুলনায়, টেবিলটিতে মায়াময়কে নতুন কিছু এনে দেয় না।
অ্যান্থেস

1

শীর্ষ অনুসারে কীগুলি অনুসারে বাছাই করতে প্রোটোটাইপে ধাক্কা।

Array.prototype.alphaSortByKey= function (key) {
    this.sort(function (a, b) {
        if (a[key] < b[key])
            return -1;
        if (a[key] > b[key])
            return 1;
        return 0;
    });
    return this;
};

0

সংবেদনশীল কেস থেকে মুক্তি পেতে আপনি অনুরূপ কিছু ব্যবহার করতে পারেন

users.sort(function(a, b){

  //compare two values
  if(a.firstname.toLowerCase() < b.firstname.toLowerCase()) return -1;
  if(a.firstname.toLowerCase() > b.firstname.toLowerCase()) return 1;
  return 0;

})

7
মিস্টারফের উত্তর হিসাবে একই উত্তর। আরও অসুবিধে যে টুলওয়ারকেসে তুলনায় চারবারের পরিবর্তে চারবার করা হয়।
অ্যান্থেস

0

আমার বাস্তবায়ন, পুরানো ES সংস্করণে দুর্দান্ত কাজ করে:

sortObject = function(data) {
    var keys = Object.keys(data);
    var result = {};

    keys.sort();

    for(var i = 0; i < keys.length; i++) {
        var key = keys[i];

        result[key] = data[key];
    }

    return result;
};

0

কেবল রেকর্ডের জন্য, যদি আপনি একটি নামযুক্ত সাজানো-ফাংশন রাখতে চান তবে বাক্যবিন্যাসটি নিম্নরূপ:

let sortFunction = (a, b) => {
 if(a.firstname < b.firstname) { return -1; }
 if(a.firstname > b.firstname) { return 1; }
 return 0;
})
users.sort(sortFunction)

নোট করুন যে নিম্নলিখিতগুলি কাজ করে না:

users.sort(sortFunction(a,b))
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.