অ্যারেতে একটি অ্যারেতে অক্ষরে অক্ষরে বাছাই করুন


200

ধরা যাক আপনার মতো জাভাস্ক্রিপ্ট ক্লাস রয়েছে

var DepartmentFactory = function(data) {
    this.id = data.Id;
    this.name = data.DepartmentName;
    this.active = data.Active;
}

ধরা যাক আপনি তারপরে সেই শ্রেণীর কয়েকটি উদাহরণ তৈরি করে এটিকে একটি অ্যারেতে সঞ্চয় করুন

var objArray = [];
objArray.push(DepartmentFactory({Id: 1, DepartmentName: 'Marketing', Active: true}));
objArray.push(DepartmentFactory({Id: 2, DepartmentName: 'Sales', Active: true}));
objArray.push(DepartmentFactory({Id: 3, DepartmentName: 'Development', Active: true}));
objArray.push(DepartmentFactory({Id: 4, DepartmentName: 'Accounting', Active: true}));

সুতরাং আমি এখন দ্বারা নির্মিত একটি অ্যারে আছে DepartmentFactory। আমি কীভাবে array.sort()পদ্ধতিটি ব্যবহার করে DepartmentNameপ্রতিটি বস্তুর সম্পত্তির দ্বারা এই অ্যারে অবজেক্টগুলিকে বাছাই করতে পারি ?

array.sort()পদ্ধতি ঠিক সূক্ষ্ম কাজ করে স্ট্রিং একটি অ্যারে বাছাই

var myarray=["Bob", "Bully", "Amy"];
myarray.sort(); //Array now becomes ["Amy", "Bob", "Bully"]

তবে আমি কীভাবে এটিকে অবজেক্টের একটি তালিকা দিয়ে কাজ করব?


আপনি .sort () এ প্রথম যুক্তি হিসাবে একটি বাছাই ফাংশনটি পাস করতে পারেন।
পল টমলিন

2
যেহেতু আপনি নির্মাতা DepartmentFactoryহিসাবে ব্যবহার করছেন তাই এটির ব্যবহার করে এর বস্তু তৈরি করুন new DepartmentFactory, অন্যথায় অ্যারেটি একগুচ্ছ undefinedমান দিয়ে পূর্ণ হবে ।
অনুরাগ

উত্তর:


341

আপনাকে এরকম কিছু করতে হবে:

objArray.sort(function(a, b) {
    var textA = a.DepartmentName.toUpperCase();
    var textB = b.DepartmentName.toUpperCase();
    return (textA < textB) ? -1 : (textA > textB) ? 1 : 0;
});

দ্রষ্টব্য: কেসটি পরিবর্তন করা (উপরের বা নিম্নে) কোনও ক্ষেত্রে সংবেদনশীল বাছাইয়ের বিষয়টি নিশ্চিত করে।


3
আমি আপনার উত্তরে 50 গাজিলিয়ন বার এসেছি কারণ এটি কীভাবে করা যায় তা আমি কখনই মনে করতে পারি না। এফডব্লিউআইডাব্লু, আমার লিন্টার সর্বদা আমাকে "অভিব্যক্তির আশেপাশে কৃত্রিম বন্ধনী" সম্পর্কে অবহিত করে: return (textA < textB) ? -1 : (textA > textB) ? 1 : 0;আপনার উত্তরটি সম্পাদন করবে না, আশা
রেখেই

এই ওমারের জন্য ধন্যবাদ
টেড ফিৎসপ্যাট্রিক

এই কোডটি নিয়ে একটি সমস্যা পেয়েছে। নিম্ন এবং বড় অক্ষরের সংমিশ্রণটি ব্যবহার করুন। প্রাক্তন। ক্রেডিট_কার্ড_না এবং শহর। কোড তালিকাকে বাছাই করে তবে 'সি' দিয়ে শুরু হওয়া শব্দগুলি একসাথে গোষ্ঠীভুক্ত হয় না।
কেদার

156

ইউনিকোড সমর্থন করতে:

objArray.sort(function(a, b) {
   return a.DepartmentName.localeCompare(b.DepartmentName);
});

7
কেস-সংবেদনশীল সংস্করণের জন্য, লাইন 2 তে নিম্নলিখিতটি ব্যবহার করুন:return a.DepartmentName.toLowerCase().localeCompare(b.DepartmentName.toLowerCase());
বেন ব্যার্থ

3
প্রতিদিন নতুন কিছু শিখুন - localeCompareদুর্দান্ত এবং এতে প্রথম আর্গের জন্য সমস্ত ব্রাউজার সমর্থন রয়েছে। খারাপ না!
obzenner

4
@ বেনবার্থে স্ট্রিংগুলি লোয়ার-কেস করার কোনও কারণ নেই। পুরো বিষয়টি localeCompareহ'ল সিস্টেমে বাছাইয়ের যুক্তি এবং স্থানীয় কৌতূহল পরিচালনার কাজটি বন্ধ করে দেওয়া। যদি কেস-সংবেদনশীল বাছাই করা লোকেলের পক্ষে স্বাভাবিক, যেমনটি এটি ইংরেজী ভাষায় রয়েছে তবে এটি আপনার জন্য করা হবে: "Z" > 'a' // false "Z".localeCompare('a') // 1 আপনি যদি লোকেলের ডিফল্ট থেকে বিচ্যুত হতে চান তবে আপনি localesoptionsপ্যারামিটারগুলিতে ওভাররাইডগুলি বরাবর পাঠাতে পারেন : বিকাশকারী.মোজিলা। org / en-US / ডক্স / ওয়েব / জাভাস্ক্রিপ্ট / রেফারেন্স /…
জন z

12
var DepartmentFactory = function(data) {
    this.id = data.Id;
    this.name = data.DepartmentName;
    this.active = data.Active;
}

// use `new DepartmentFactory` as given below. `new` is imporatant

var objArray = [];
objArray.push(new DepartmentFactory({Id: 1, DepartmentName: 'Marketing', Active: true}));
objArray.push(new DepartmentFactory({Id: 2, DepartmentName: 'Sales', Active: true}));
objArray.push(new DepartmentFactory({Id: 3, DepartmentName: 'Development', Active: true}));
objArray.push(new DepartmentFactory({Id: 4, DepartmentName: 'Accounting', Active: true}));

function sortOn(property){
    return function(a, b){
        if(a[property] < b[property]){
            return -1;
        }else if(a[property] > b[property]){
            return 1;
        }else{
            return 0;   
        }
    }
}

//objArray.sort(sortOn("id")); // because `this.id = data.Id;`
objArray.sort(sortOn("name")); // because `this.name = data.DepartmentName;`
console.log(objArray);

ডেমো: http://jsfiddle.net/diode/hdgeH/


9
// Sorts an array of objects "in place". (Meaning that the original array will be modified and nothing gets returned.)
function sortOn (arr, prop) {
    arr.sort (
        function (a, b) {
            if (a[prop] < b[prop]){
                return -1;
            } else if (a[prop] > b[prop]){
                return 1;
            } else {
                return 0;   
            }
        }
    );
}

//Usage example:

var cars = [
        {make:"AMC",        model:"Pacer",  year:1978},
        {make:"Koenigsegg", model:"CCGT",   year:2011},
        {make:"Pagani",     model:"Zonda",  year:2006},
        ];

// ------- make -------
sortOn(cars, "make");
console.log(cars);

/* OUTPUT:
AMC         : Pacer : 1978
Koenigsegg  : CCGT  : 2011
Pagani      : Zonda : 2006
*/



// ------- model -------
sortOn(cars, "model");
console.log(cars);

/* OUTPUT:
Koenigsegg  : CCGT  : 2011
AMC         : Pacer : 1978
Pagani      : Zonda : 2006
*/



// ------- year -------
sortOn(cars, "year");
console.log(cars);

/* OUTPUT:
AMC         : Pacer : 1978
Pagani      : Zonda : 2006
Koenigsegg  : CCGT  : 2011
*/

5

ডেমো

var DepartmentFactory = function(data) {
    this.id = data.Id;
    this.name = data.DepartmentName;
    this.active = data.Active;
}

var objArray = [];
objArray.push(new DepartmentFactory({Id: 1, DepartmentName: 'Marketing', Active: true}));
objArray.push(new DepartmentFactory({Id: 2, DepartmentName: 'Sales', Active: true}));
objArray.push(new DepartmentFactory({Id: 3, DepartmentName: 'Development', Active: true}));
objArray.push(new DepartmentFactory({Id: 4, DepartmentName: 'Accounting', Active: true}));

console.log(objArray.sort(function(a, b) { return a.name > b.name}));


1

এটা এভাবে করো

objArrayy.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)
});
console.log(objArray)

1
objArray.sort( (a, b) => a.id.localeCompare(b.id, 'en', {'sensitivity': 'base'}));

এটি তাদের বর্ণমালা অনুসারে বাছাই করে এবং এটি সংবেদনশীল। এটি খুব পরিষ্কার এবং সহজেই পড়া সহজ: ডি


গৃহীত সমাধানের চেয়ে অনেক বেশি মার্জিত!
কানো

0

এখানে একটি সাধারণ ক্রিয়া যা আপনি তাদের বৈশিষ্ট্যগুলির মাধ্যমে বস্তুর অ্যারে বাছাই করতে ব্যবহার করতে পারেন; সম্পত্তি এক ধরণের স্ট্রিং বা পূর্ণসংখ্যা কিনা তা বিবেচ্য নয়, এটি কাজ করবে।

    var cars = [
        {make:"AMC",        model:"Pacer",  year:1978},
        {make:"Koenigsegg", model:"CCGT",   year:2011},
        {make:"Pagani",     model:"Zonda",  year:2006},
    ];

    function sortObjectsByProp(objectsArr, prop, ascending = true) {
        let objectsHaveProp = objectsArr.every(object => object.hasOwnProperty(prop));
        if(objectsHaveProp)    {
            let newObjectsArr = objectsArr.slice();
            newObjectsArr.sort((a, b) => {
                if(isNaN(Number(a[prop])))  {
                    let textA = a[prop].toUpperCase(),
                        textB = b[prop].toUpperCase();
                    if(ascending)   {
                        return textA < textB ? -1 : textA > textB ? 1 : 0;
                    } else {
                        return textB < textA ? -1 : textB > textA ? 1 : 0;
                    }
                } else {
                    return ascending ? a[prop] - b[prop] : b[prop] - a[prop];
                }
            });
            return newObjectsArr;
        }
        return objectsArr;
    }

    let sortedByMake = sortObjectsByProp(cars, "make"); // returns ascending order by its make;
    let sortedByYear = sortObjectsByProp(cars, "year", false); // returns descending order by its year,since we put false as a third argument;
    console.log(sortedByMake);
    console.log(sortedByYear);


-1

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

objArray.sort(function(a,b) {
    return a.id-b.id;
});
// objArray is now sorted by Id

5
তিনি আইডি নয়, ডিপার্টমেন্টাল নাম অনুসারে বাছাইয়ের বিষয়ে জিজ্ঞাসা করেছিলেন।
পল টমলিন

আমি এটি চেষ্টা করেছি এবং এটি স্ট্রিং কলামগুলিতে কাজ করছে বলে মনে হচ্ছে না ... এটি একটি তারিখ কলামে কাজ করেছে। @ ওমর-
বোখারী

-2

এ সম্পর্কে কিছুটা চেষ্টা করার পরে এবং যতটা সম্ভব কম লুপ তৈরি করার চেষ্টা করার পরে আমি এই সমাধানটি দিয়ে শেষ করেছি:

কোডেপেনে ডেমো

const items = [
      {
        name: 'One'
      },
      {
        name: 'Maria is here'
      },
      {
        name: 'Another'
      },
      {
        name: 'Z with a z'
      },
      {
        name: '1 number'
      },
      {
        name: 'Two not a number'
      },
      {
        name: 'Third'
      },
      {
        name: 'Giant'
      }
    ];

    const sorted = items.sort((a, b) => {
      return a[name] > b[name];
    });

    let sortedAlphabetically = {};

    for(var item in sorted) {
      const firstLetter = sorted[item].name[0];
      if(sortedAlphabetically[firstLetter]) {
        sortedAlphabetically[firstLetter].push(sorted[item]);
      } else {
        sortedAlphabetically[firstLetter] = [sorted[item]]; 
      }
    }

    console.log('sorted', sortedAlphabetically);

-3

একটি সহজ উত্তর:

objArray.sort(function(obj1, obj2) {
   return obj1.DepartmentName > obj2.DepartmentName;
});

ES6 উপায়:

objArray.sort((obj1, obj2) => {return obj1.DepartmentName > obj2.DepartmentName};

আপনার যদি এটি ছোট / বড় হাতের ইত্যাদি তৈরি করার প্রয়োজন হয় তবে কেবল এটি করুন এবং ফলাফলের সাথে সেই ভেরিয়েবলের তুলনা করুন able উদাহরণ:

objArray.sort((obj1, obj2) => {
   var firstObj = obj1.toLowerCase();
   var secondObj = obj2.toLowerCase();
   return firstObj.DepartmentName > secondObj.DepartmentName;
});
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.