আপনি একাধিক কলামে একটি অ্যারে কীভাবে সাজান?


119

আমার একটি বহুমাত্রিক অ্যারে রয়েছে। প্রাথমিক অ্যারে একটি অ্যারে হয়

[publicationID][publication_name][ownderID][owner_name] 

আমি যা করার চেষ্টা করছি তা হচ্ছে অ্যারের অনুসারে বাছাই owner_nameকরা publication_name। আমি আপনার কাছে জাভাস্ক্রিপ্টে জানি Array.sort(), আপনি আমার নিজের ক্ষেত্রে কাস্টম ফাংশন রাখতে পারেন:

function mysortfunction(a, b) {
    var x = a[3].toLowerCase();
    var y = b[3].toLowerCase();

    return ((x < y) ? -1 : ((x > y) ? 1 : 0));
}

এই মাত্র একটি কলাম উপর বাছাই, যথা OWNER_NAME জন্য জরিমানা, কিন্তু আমি এটা উপর বাছাই করতে কিভাবে পরিবর্তন করবেন owner_name, তারপর publication_name?

উত্তর:


166

মালিকের নাম পৃথক হলে তাদের অনুসারে বাছাই করুন। অন্যথায় টাইব্রেকারের জন্য প্রকাশনার নাম ব্যবহার করুন।

function mysortfunction(a, b) {

  var o1 = a[3].toLowerCase();
  var o2 = b[3].toLowerCase();

  var p1 = a[1].toLowerCase();
  var p2 = b[1].toLowerCase();

  if (o1 < o2) return -1;
  if (o1 > o2) return 1;
  if (p1 < p2) return -1;
  if (p1 > p2) return 1;
  return 0;
}

@dcp আমি দেখতে পাচ্ছি না কীভাবে এটি দ্বিতীয় বৈশিষ্ট্যটি বাছাই করে। আপনি যতটা নির্বাচিত কলামগুলির সংখ্যা লুপ না করে .. আমি ঠিক আছি? যেমন[[A, 10], [J, 15], [A, 5], [J, 5]] => [[A, 10], [A, 5], [J, 15], [J, 5]]
ব্লে ...

2
@ ব্যবহারকারী 26409021 - না, এটি ঠিক নয়। এটি [[এ, 5], [এ, 10], [জে, 5], [জে, 15]] এর সমাপ্ত হবে। এটি প্রথমে প্রথম বৈশিষ্ট্য অনুসারে বাছাই করে এবং যদি সেগুলি একই হয় তবে এটি দ্বিতীয় বৈশিষ্ট্য অনুসারে বাছাই করে। সুতরাং আপনার উদাহরণস্বরূপ, এ জে'র আগে উপস্থিত হবে the ক্ষেত্রে যেখানে দুটি দুটি উপাদানের জন্য সমান, সেখানে এটি দ্বিতীয় বৈশিষ্ট্যটি ব্যবহার করবে। সুতরাং [A, 10], [এ, 5], 5 10 এর আগে আসে তাই এটি অর্ডার করার জন্য [A, 5], [A, 10] এর সাথে শেষ হবে। আপনি যে জিনিসটি অনুপস্থিত হতে পারেন তা হ'ল আপনি বাছাই সম্পন্ন না হওয়া অবধি অ্যারে.সোর্টটি ব্যবহার করার সময় একাধিকবার মাইসফরঞ্চটি বলা হয়।
ডিসিপি

3
@ ব্যবহারকারী 26409021 - মাইসফারফংশন ফাংশনে একটি লুপের প্রয়োজন নেই, কারণ অ্যারে ডাব্লু সারণি যথাযথভাবে বাছাই না করা অবধি ফাংশনটি কল করবে। আর্গুমেন্ট a এবং b সমান কিনা, a খ এর চেয়ে কম কিনা, বা a এর চেয়ে বড় কিনা তা নির্ধারণ করাই একমাত্র মাইসফরঞ্চটি দায়বদ্ধ। আমাদের এই দৃ .়সংকল্পবদ্ধ করার জন্য কোনও লুপের দরকার নেই। আশা করি এইটি কাজ করবে.
ডিসিপি

58

আমি মনে করি আপনি যা খুঁজছেন তা হ'ল বিবি.জেএস: https://github.com/Teun/thenBy.js

এটি আপনাকে স্ট্যান্ডার্ড অ্যারে.সোর্ট ব্যবহার করার অনুমতি দেয় firstBy().thenBy().thenBy()

একটি উদাহরণ এখানে দেখা যায়


বড় ডেটাসেটে পারফরম্যান্স সম্পর্কে সতর্ক থাকুন। প্রতিবার thenByবলা হয়, সমস্ত অ্যারে আইটেম আবার লুপ করা হয়।
রায় শান

6
অবশ্যই এটি হয় না। আপনি ততক্ষণে () দ্বারা কল করলে এটি একটি নতুন ফাংশন তৈরি করে যা পূর্ববর্তীটিকে আবদ্ধ করে। বাছাইয়ের সময়, জাভাস্ক্রিপ্ট আইটেমগুলিকে কঠোরভাবে "লুপ" করবে না, তবে এটি আপনাকে বহুবার পাস করা ফাংশনটিকে কল করবে । তখন বাই ব্যবহার করে কলগুলির সংখ্যা পরিবর্তন হবে না। কিছু পারফরম্যান্স বিবেচনার জন্য, পড়ুন: github.com/Teun/thenBy.js#a-word-on-performance
ডি

2
আমি দেখছি, আমি ভুল ছিলাম, পারফরম্যান্স সম্পর্কে চিন্তা করার জন্য ধন্যবাদ। নতুন ফাংশন দিয়ে ক্লোজার তৈরির স্মৃতি বিবেচনার জন্য সম্ভবত একটি নোট যুক্ত করবেন?
রায় শান

একাধিক গতিশীল জন্য এটি কীভাবে ব্যবহার করবেন? বা একটি লুপ জন্য?
হেমিল প্যাটেল

@ হ্যারি যদি আপনি এটি কাজ করতে না পারেন তবে দয়া করে এমন একটি সমস্যা পোস্ট করুন যাতে উদাহরণটি সাজানো যায় না, যাতে অন্যরাও শিখতে পারে। আপনাকে সাহায্য করে খুশি। github.com/Teun/thenBy.js/issues
ডি

35

স্ট্রিংযুক্ত এমন অনেকগুলি ক্ষেত্রগুলিতে বাছাই করার একটি ভাল উপায় হ'ল ব্যবহার toLocaleCompareএবং বুলিয়ান অপারেটর||

কিছুটা এইরকম:

// Sorting record releases by name and then by title.
releases.sort((oldRelease, newRelease) => {
  const compareName = oldRelease.name.localeCompare(newRelease.name);
  const compareTitle = oldRelease.title.localeCompare(newRelease.title);

  return compareName || compareTitle;
})

আপনি যদি আরও ক্ষেত্রগুলিতে বাছাই করতে চান তবে আপনি আরও বুলিয়ান অপারেটরগুলির সাথে রিটার্ন স্টেটমেন্টটি সরিয়ে ফেলতে পারেন।


বস্তুত হিসাবে, এটিকে আপ পরিপাটি পারে সঙ্গে.reduce()
ekkis

তবে, .localCompare()a -1, 0, 1 প্রদান করে তাই আমি মনে করি না যে আপনার সমাধানটি || হিসাবে কাজ করবে বুলিয়ানদের পক্ষে ভাল
এক্কিস

10
@ ইক্কিস, 1 এবং -1 উভয়ই "সত্যবাদী", সুতরাং এটি একটি খুব মার্জিত সমাধান। আমি সবেমাত্র এটি করেছি: sortItems = (a, b) => (a.distance - b.distance) || (a.name - b.name); এবং এটি আমার অ পিক-অ প্রয়োজনীয় প্রয়োজনের জন্য কবিতার মতো কাজ করে।
বর্ধিত

1
@bstst আপনার উপায়টি আরও ভাল, কারণ এটি (a.name - b.name)প্রয়োজনীয় না হলে মূল্যায়ন করে না । ভেরিয়েবল তৈরি করা প্রয়োজন না হলেও প্রথমে অতিরিক্ত কাজ করে।
andi

এটি সত্য, এটি প্রয়োজনের চেয়ে আরও বেশি কাজ করে তবে আমি কেবল সমালোচনামূলক ক্ষেত্রে এটি পরিবর্তন করব। কোডের জন্য যা নামমাত্র পরিমাণে ডেটা বাছাই করে কোডের স্বচ্ছতা পারফেক্টকে ট্রাম্প করে।
tbranyen

27

এসকিউএল-স্টাইলের মিশ্র asc এবং ডেস্ক অবজেক্ট অ্যারে বাছাইয়ের মাধ্যমে কী করা দরকার তা পূর্ণ হয়েছে।

উপরের কেনেবেকের সমাধান আমাকে এটি পেতে সহায়তা করেছে:

Array.prototype.keySort = function(keys) {

keys = keys || {};

// via
// /programming/5223/length-of-javascript-object-ie-associative-array
var obLen = function(obj) {
    var size = 0, key;
    for (key in obj) {
        if (obj.hasOwnProperty(key))
            size++;
    }
    return size;
};

// avoiding using Object.keys because I guess did it have IE8 issues?
// else var obIx = function(obj, ix){ return Object.keys(obj)[ix]; } or
// whatever
var obIx = function(obj, ix) {
    var size = 0, key;
    for (key in obj) {
        if (obj.hasOwnProperty(key)) {
            if (size == ix)
                return key;
            size++;
        }
    }
    return false;
};

var keySort = function(a, b, d) {
    d = d !== null ? d : 1;
    // a = a.toLowerCase(); // this breaks numbers
    // b = b.toLowerCase();
    if (a == b)
        return 0;
    return a > b ? 1 * d : -1 * d;
};

var KL = obLen(keys);

if (!KL)
    return this.sort(keySort);

for ( var k in keys) {
    // asc unless desc or skip
    keys[k] = 
            keys[k] == 'desc' || keys[k] == -1  ? -1 
          : (keys[k] == 'skip' || keys[k] === 0 ? 0 
          : 1);
}

this.sort(function(a, b) {
    var sorted = 0, ix = 0;

    while (sorted === 0 && ix < KL) {
        var k = obIx(keys, ix);
        if (k) {
            var dir = keys[k];
            sorted = keySort(a[k], b[k], dir);
            ix++;
        }
    }
    return sorted;
});
return this;
};

নমুনা ব্যবহার:

var obja = [
  {USER:"bob",  SCORE:2000, TIME:32,    AGE:16, COUNTRY:"US"},
  {USER:"jane", SCORE:4000, TIME:35,    AGE:16, COUNTRY:"DE"},
  {USER:"tim",  SCORE:1000, TIME:30,    AGE:17, COUNTRY:"UK"},
  {USER:"mary", SCORE:1500, TIME:31,    AGE:19, COUNTRY:"PL"},
  {USER:"joe",  SCORE:2500, TIME:33,    AGE:18, COUNTRY:"US"},
  {USER:"sally",    SCORE:2000, TIME:30,    AGE:16, COUNTRY:"CA"},
  {USER:"yuri", SCORE:3000, TIME:34,    AGE:19, COUNTRY:"RU"},
  {USER:"anita",    SCORE:2500, TIME:32,    AGE:17, COUNTRY:"LV"},
  {USER:"mark", SCORE:2000, TIME:30,    AGE:18, COUNTRY:"DE"},
  {USER:"amy",  SCORE:1500, TIME:29,    AGE:19, COUNTRY:"UK"}
];

var sorto = {
  SCORE:"desc",TIME:"asc", AGE:"asc"
};

obja.keySort(sorto);

নিম্নলিখিত ফলন:

 0: {     USER: jane;     SCORE: 4000;    TIME: 35;       AGE: 16;    COUNTRY: DE;   }
 1: {     USER: yuri;     SCORE: 3000;    TIME: 34;       AGE: 19;    COUNTRY: RU;   }
 2: {     USER: anita;    SCORE: 2500;    TIME: 32;       AGE: 17;    COUNTRY: LV;   }
 3: {     USER: joe;      SCORE: 2500;    TIME: 33;       AGE: 18;    COUNTRY: US;   }
 4: {     USER: sally;    SCORE: 2000;    TIME: 30;       AGE: 16;    COUNTRY: CA;   }
 5: {     USER: mark;     SCORE: 2000;    TIME: 30;       AGE: 18;    COUNTRY: DE;   }
 6: {     USER: bob;      SCORE: 2000;    TIME: 32;       AGE: 16;    COUNTRY: US;   }
 7: {     USER: amy;      SCORE: 1500;    TIME: 29;       AGE: 19;    COUNTRY: UK;   }
 8: {     USER: mary;     SCORE: 1500;    TIME: 31;       AGE: 19;    COUNTRY: PL;   }
 9: {     USER: tim;      SCORE: 1000;    TIME: 30;       AGE: 17;    COUNTRY: UK;   }
 keySort: {  }

( এখান থেকে একটি মুদ্রণ ফাংশন ব্যবহার করে )

এখানে একটি jsbin উদাহরণ

সম্পাদনা: গিথুব এ mksort.js হিসাবে পরিষ্কার এবং পোস্ট করা হয়েছে


17

এটি সমস্ত আকারের আলফা প্রকারের জন্য কার্যকর। আপনি যে সূচকগুলি অনুসারে বাছাই করতে চান তা তত্ক্ষণিক হিসাবে পাস করুন।

Array.prototype.deepSortAlpha= function(){
    var itm, L=arguments.length, order=arguments;

    var alphaSort= function(a, b){
        a= a.toLowerCase();
        b= b.toLowerCase();
        if(a== b) return 0;
        return a> b? 1:-1;
    }
    if(!L) return this.sort(alphaSort);

    this.sort(function(a, b){
        var tem= 0,  indx=0;
        while(tem==0 && indx<L){
            itm=order[indx];
            tem= alphaSort(a[itm], b[itm]); 
            indx+=1;        
        }
        return tem;
    });
    return this;
}

var arr= [[ "Nilesh","Karmshil"], ["Pranjal","Deka"], ["Susants","Ghosh"],
["Shiv","Shankar"], ["Javid","Ghosh"], ["Shaher","Banu"], ["Javid","Rashid"]];

arr.deepSortAlpha(1,0);

আপনি কীভাবে এই ডেটা সংগ্রহ করেছেন তা আমি জানতে পারি [["নীলেশ", "কর্মশিল"], ["প্রাণজাল", "ডেকা"], ["সুসেন্টস", "ঘোষ"], ["শিব", "শঙ্কর"] , ["জাভিদ", "ঘোষ"], ["শাহের", "বানু"], ["জাভিদ", "রশিদ"]];
Defau1t

11

আমি তুলনামূলকভাবে একটি বিল্ট ব্যবহার করার পরামর্শ দিচ্ছি এবং লজিকাল বা এর সাথে সৃজনশীল ক্রমটি সৃজন করতে চাই ||

function customSort(a, b) {
    return a[3].localeCompare(b[3]) || a[1].localeCompare(b[1]);
}

কাজের উদাহরণ:

var array = [
    [0, 'Aluminium', 0, 'Francis'],
    [1, 'Argon', 1, 'Ada'],
    [2, 'Brom', 2, 'John'],
    [3, 'Cadmium', 3, 'Marie'],
    [4, 'Fluor', 3, 'Marie'],
    [5, 'Gold', 1, 'Ada'],
    [6, 'Kupfer', 4, 'Ines'],
    [7, 'Krypton', 4, 'Joe'],
    [8, 'Sauerstoff', 3, 'Marie'],
    [9, 'Zink', 5, 'Max']
];

array.sort(function (a, b) {
    return a[3].localeCompare(b[3]) || a[1].localeCompare(b[1]);
});

document.write('<pre>');
array.forEach(function (a) {
    document.write(JSON.stringify(a) + '<br>');
});


এটি আমার জন্য কাজ করে মহান! বুঝতে সহজ। ধন্যবাদ!
ড্যানকিউ


8

আপনি 2 টি ভেরিয়েবলগুলি একত্রে একটি सॉোর্টকিতে পরিণত করতে এবং এটি আপনার তুলনার জন্য ব্যবহার করতে পারেন।

list.sort(function(a,b){
   var aCat = a.var1 + a.var2;
   var bCat = b.var1 + b.var2;
   return (aCat > bCat ? 1 : aCat < bCat ? -1 : 0);
});

@ গুস্তাভোরড্রিগস সম্ভবত এটি ভঙ্গুর কারণ। এটি নির্দিষ্ট ইনপুট কীগুলিতে প্রত্যাশিত ফ্যাশনটিকে সাজানোর জন্য ব্যর্থ হবে যেহেতু এটি কোনও সীমানা ছাড়াই বা অন্য পার্থক্য ছাড়াই দুটি অংশ একসাথে ছড়িয়ে দেয়। আইটেম এক্সের জন্য var1 এবং var2 "foo" এবং "বাজ" ছিল কিনা তা বিবেচনা করুন, আইটেম Y এর জন্য var1 "foobar" ছিল কিনা Consider যখন সাজানো এক্স প্রথমে আসবে তবে এই ক্ষেত্রে এটি দ্বিতীয় হবে। এই উত্তরটি উন্নত করা যেতে পারে তবে যেমনটি বলা হয়েছে এটি নিরাপদ নয়।
পিটার হ্যানসেন

4

আমি মাল্টিসোটার পেয়েছি । এটি একাধিক বাছাইয়ের জন্য সহজ, পাওয়ারফুল এবং ছোট লাইব্রেরি। ডায়নামিকস বাছাইয়ের মানদণ্ডের সাথে আমার অবজেক্টগুলির একটি অ্যারে বাছাই করা দরকার ছিল:

const criteria = ['name', 'speciality']
const data = [
  { name: 'Mike', speciality: 'JS', age: 22 },
  { name: 'Tom', speciality: 'Java', age: 30 },
  { name: 'Mike', speciality: 'PHP', age: 40 },
  { name: 'Abby', speciality: 'Design', age: 20 },
]

const sorted = multisort(data, criteria)

console.log(sorted)
<script src="https://cdn.rawgit.com/peterkhayes/multisort/master/multisort.js"></script>

এই লাইব্রেরিটি আরও বেশি শক্তিশালী, আমার ক্ষেত্রে এটি ছিল। চেষ্টা করে দেখুন


2

আমি ng-gridএকটি এপিআই থেকে ফিরে রেকর্ডের একটি অ্যারে একাধিক কলাম বাছাইয়ের সাথে কাজ করছি এবং তাই আমি এই নিফটি, ডায়নামিক মাল্টি-সাজানোর ফাংশনটি নিয়ে এসেছি।

প্রথমত, ng-grid"এনজিগ্রিডসোর্টড" এর জন্য একটি "ইভেন্ট" চালিত করে এবং এই কাঠামোটি সাজিয়ে বর্ণনাটি পাস করে:

sortData = {
    columns:    DOM Element,
    directions: [], //Array of string values desc or asc. Each index relating to the same index of fields
    fields:     [], //Array of string values
};

সুতরাং আমি একটি ফাংশন তৈরি করেছি যা sortDataউপরের চিত্রের উপর ভিত্তি করে গতিশীলভাবে একটি সাজানোর ফাংশন তৈরি করবে ( স্ক্রোল বার দ্বারা ভয় পাবেন না! এটি প্রায় 50 লাইন দীর্ঘ! এছাড়াও, aboutাল সম্পর্কে আমি দুঃখিত, এটি একটি অনুভূমিক প্রতিরোধ করেছিল স্ক্রোলবার! ):

function SortingFunction(sortData)
{
    this.sortData = sortData;

    this.sort = function(a, b)
    {
        var retval = 0;

        if(this.sortData.fields.length)
        {
            var i = 0;

            /*
                Determine if there is a column that both entities (a and b)
                have that are not exactly equal. The first one that we find
                will be the column we sort on. If a valid column is not
                located, then we will return 0 (equal).
            */
            while(  (   !a.hasOwnProperty(this.sortData.fields[i]) 
                    ||  !b.hasOwnProperty(this.sortData.fields[i]) 
                    ||  (a.hasOwnProperty(this.sortData.fields[i]) 
                        && b.hasOwnProperty(this.sortData.fields[i]) 
                        && a[this.sortData.fields[i]] === b[this.sortData.fields[i]])
                    ) && i < this.sortData.fields.length){
                i++;
            }

            if(i < this.sortData.fields.length)
            {
                /*
                    A valid column was located for both entities
                    in the SortData. Now perform the sort.
                */
                if(this.sortData.directions 
                && i < this.sortData.directions.length 
                && this.sortData.directions[i] === 'desc')
                {
                    if(a[this.sortData.fields[i]] > b[this.sortData.fields[i]])
                        retval = -1;
                    else if(a[this.sortData.fields[i]] < b[this.sortData.fields[i]])
                        retval = 1;
                }
                else
                {
                    if(a[this.sortData.fields[i]] < b[this.sortData.fields[i]])
                        retval = -1;
                    else if(a[this.sortData.fields[i]] > b[this.sortData.fields[i]])
                        retval = 1;
                }
            }
        }

        return retval;
    }.bind(this);
}

আমি তখন আমার এপিআই ( results) এর ফলাফলগুলি এর মতো সাজান :

results.sort(new SortingFunction(sortData).sort);

আমি আশা করি অন্য যে কেউ আমার মতো সমাধানটি উপভোগ করবেন! ধন্যবাদ!


বাছাই করা ডেটাতে কলামগুলি কীসের জন্য ব্যবহৃত হয়?
অ্যালেক্স হোপ ও'কনোর

2

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

t.sort( (a,b)=> a[3].localeCompare(b[3]) || a[1].localeCompare(b[1]) );

আমি ধরে নিয়েছি যে আপনার ডেটা অ্যারেতে রয়েছে let t = [ [publicationID, publication_name, ownderID, owner_name ], ... ]যেখানে মালিক_নাম = 3 এবং প্রকাশনার নাম = 1 এর সূচি রয়েছে।


2

স্ট্রিং সংযোজন পদ্ধতি

স্ট্রিংয়ের সাথে মানগুলি যুক্ত করে এবং স্ট্রিংগুলির তুলনা করে আপনি একাধিক মান অনুসারে বাছাই করতে পারেন। একটি কী থেকে পরের অংশে রানঅফ আটকাতে একটি বিভক্ত কী চরিত্র যুক্ত করা সহায়ক।

উদাহরণ

const arr = [ 
    { a: 1, b: 'a', c: 3 },
    { a: 2, b: 'a', c: 5 },
    { a: 1, b: 'b', c: 4 },
    { a: 2, b: 'a', c: 4 }
]


function sortBy (arr, keys, splitKeyChar='~') {
    return arr.sort((i1,i2) => {
        const sortStr1 = keys.reduce((str, key) => str + splitKeyChar+i1[key], '')
        const sortStr2 = keys.reduce((str, key) => str + splitKeyChar+i2[key], '')
        return sortStr1.localeCompare(sortStr2)
    })
}

console.log(sortBy(arr, ['a', 'b', 'c']))


1
function multiSort() {

    var args =$.makeArray( arguments ),
        sortOrder=1, prop='', aa='',  b='';

    return function (a, b) {

       for (var i=0; i<args.length; i++){

         if(args[i][0]==='-'){
            prop=args[i].substr(1)
            sortOrder=-1
         }
         else{sortOrder=1; prop=args[i]}

         aa = a[prop].toLowerCase()
         bb = b[prop].toLowerCase()

         if (aa < bb) return -1 * sortOrder;
         if (aa > bb) return 1 * sortOrder;

       }

       return 0
    }

}
empArray.sort(multiSort( 'lastname','firstname')) Reverse with '-lastname'

1

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

আমি লক্ষ করেছি যে বহু-মানদণ্ড বাছাই করা হচ্ছে:

- sort by the first column
- if equal, sort by the second
- if equal, sort by the third
-  etc... nesting and nesting if-else

এবং যদি আপনি যত্ন না পান তবে আপনি খুব শীঘ্রই যদি বাসা বাঁধতে থাকেন তবে ...

বিকল্পের কোন অংশটি ব্যবহার করে তা স্থির করতে আমরা যদি কোনও "প্রিডিকেট" ফাংশন লিখি তবে কী হবে? ভবিষ্যদ্বাণীটি সহজভাবে:

// useful for chaining test
const decide = (test, other) => test === 0 ? other : test

এখন আপনার শ্রেণিবদ্ধি পরীক্ষার (বাইকাউন্ট্রি সাইজ, বাইএজ, বাই গেমটাইপ, বাইস্কোর, বাই লেভেল ...) লেখার পরে যা কিছু প্রয়োজন, আপনি আপনার পরীক্ষাগুলি (1 = asc, -1 = desc, 0 = অক্ষম) ওজন করতে পারেন, এগুলিতে একটি অ্যারে রাখুন , এবং একটি হ্রাস 'সিদ্ধান্ত' ফাংশন প্রয়োগ করুন:

const multisort = (s1, s2) => {
  const bcs = -1 * byCountrySize(s1, s2) // -1 = desc 
  const ba =  1 *byAge(s1, s2)
  const bgt = 0 * byGameType(s1, s2) // 0 = doesn't matter
  const bs = 1 * byScore(s1, s2)
  const bl = -1 * byLevel(s1, s2) // -1 = desc

  // ... other weights and criterias

  // array order matters !
  return [bcs, ba, bgt, bs, bl].reduce((acc, val) => decide(val, acc), 0)
}

// invoke [].sort with custom sort...
scores.sort(multisort)

ও ভয়েলা! আপনার নিজের মানদণ্ড / ওজন / আদেশগুলি সংজ্ঞায়িত করা আপনার পক্ষে ... তবে আপনি ধারণাটি পাবেন। আশাকরি এটা সাহায্য করবে !

সম্পাদনা: * প্রতিটি কলামে মোট বাছাইয়ের আদেশ রয়েছে তা নিশ্চিত করুন * কলামের অর্ডারের মধ্যে নির্ভরতা না থাকার বিষয়ে বিজ্ঞপ্তি রাখুন, এবং কোনও বিজ্ঞপ্তি নির্ভরতা নেই

যদি, না, বাছাই অস্থির হতে পারে!


1

ES6 পুনরাবৃত্ত (ব্লিনক) এর সাথে কাজ করার জন্য আমার নিজের লাইব্রেরিটি ( অন্যান্য জিনিসের মধ্যে) সহজ মাল্টি-লেভেল বাছাইয়ের অনুমতি দেয়

const blinq = window.blinq.blinq
// or import { blinq } from 'blinq'
// or const { blinq } = require('blinq')
const dates = [{
    day: 1, month: 10, year: 2000
  },
  {
    day: 1, month: 1, year: 2000
  },
  {
    day: 2, month: 1, year: 2000
  },
  {
    day: 1, month: 1, year: 1999
  },
  {
    day: 1, month: 1, year: 2000
  }
]
const sortedDates = blinq(dates)
  .orderBy(x => x.year)
  .thenBy(x => x.month)
  .thenBy(x => x.day);

console.log(sortedDates.toArray())
// or console.log([...sortedDates])
<script src="https://cdn.jsdelivr.net/npm/blinq@2.0.2"></script>


0

গিটহাব থেকে উত্সাহিত

function sortMethodAsc(a, b) {
    return a == b ? 0 : a > b ? 1 : -1;
}

function sortMethodWithDirection(direction) { 
    if (direction === undefined || direction == "asc") {
        return sortMethodAsc;
    } else {
        return function(a, b) {
            return -sortMethodAsc(a, b);
        } 
    }
}

function sortMethodWithDirectionByColumn(columnName, direction){   
    const sortMethod = sortMethodWithDirection(direction)
    return function(a, b){
        return sortMethod(a[columnName], b[columnName]);
    } 
}

function sortMethodWithDirectionMultiColumn(sortArray) {
    //sample of sortArray
    // sortArray = [
    //     { column: "column5", direction: "asc" },
    //     { column: "column3", direction: "desc" }
    // ]
    const sortMethodsForColumn = (sortArray || []).map( item => sortMethodWithDirectionByColumn(item.column, item.direction) );
    return function(a,b) {
        let sorted = 0;
        let index = 0;
        while (sorted === 0 && index < sortMethodsForColumn.length) {
            sorted = sortMethodsForColumn[index++](a,b);
        }
        return sorted;
    }
} 

//=============================================
//=============================================
//=============================================
//test

var data = [
    {"CountryName":"Aruba","CountryCode":"ABW","GNI":280},{
        "CountryName":"Afghanistan","CountryCode":"ABW","GNI":280},{"CountryName":"Angola","CountryCode":"AGO","GNI":280},{"CountryName":"Albania","CountryCode":"ALB","GNI":4320},
        {"CountryName":"Arab World","CountryCode":"ARB","GNI":280},{"CountryName":"United Arab Emirates","CountryCode":"ARE","GNI":39130},
        {"CountryName":"Argentina","CountryCode":"ARG","GNI":13030},{"CountryName":"Armenia","CountryCode":"ARM","GNI":3990},{"CountryName":"American Samoa","CountryCode":"ASM","GNI":280},
        {"CountryName":"Antigua and Barbuda","CountryCode":"ATG","GNI":13810},{"CountryName":"Australia","CountryCode":"AUS","GNI":51360},
        {"CountryName":"Austria","CountryCode":"AUT","GNI":45440},{"CountryName":"Azerbaijan","CountryCode":"AZE","GNI":4080},{"CountryName":"Burundi","CountryCode":"BDI","GNI":280},
        {"CountryName":"Belgium","CountryCode":"BEL","GNI":41790},{"CountryName":"Benin","CountryCode":"BEN","GNI":800},{"CountryName":"Burkina Faso","CountryCode":"BFA","GNI":590},
        {"CountryName":"Bangladesh","CountryCode":"BGD","GNI":1470},{"CountryName":"Bulgaria","CountryCode":"BGR","GNI":7860},{"CountryName":"Bahrain","CountryCode":"BHR","GNI":21150},
        {"CountryName":"Bosnia and Herzegovina","CountryCode":"BIH","GNI":4910},{"CountryName":"Belarus","CountryCode":"BLR","GNI":5280},
        {"CountryName":"Belize","CountryCode":"BLZ","GNI":4390},{"CountryName":"Bolivia","CountryCode":"BOL","GNI":3130},{"CountryName":"Brazil","CountryCode":"BRA","GNI":8600},
        {"CountryName":"Barbados","CountryCode":"BRB","GNI":15270},{"CountryName":"Brunei Darussalam","CountryCode":"BRN","GNI":29600},
        {"CountryName":"Bhutan","CountryCode":"BTN","GNI":2660},{"CountryName":"Botswana","CountryCode":"BWA","GNI":6730},
        {"CountryName":"Central African Republic","CountryCode":"CAF","GNI":390},{"CountryName":"Canada","CountryCode":"CAN","GNI":42870},
        {"CountryName":"Central Europe and the Baltics","CountryCode":"CEB","GNI":13009},{"CountryName":"Switzerland","CountryCode":"CHE","GNI":80560},
        {"CountryName":"Chile","CountryCode":"CHL","GNI":13610},{"CountryName":"China","CountryCode":"CHN","GNI":8690},{"CountryName":"Cote d'Ivoire","CountryCode":"CIV","GNI":1580},
        {"CountryName":"Cameroon","CountryCode":"CMR","GNI":1370},{"CountryName":"Colombia","CountryCode":"COL","GNI":5890},{"CountryName":"Comoros","CountryCode":"COM","GNI":1280},
        {"CountryName":"Cabo Verde","CountryCode":"CPV","GNI":3030},{"CountryName":"Costa Rica","CountryCode":"CRI","GNI":11120},
        {"CountryName":"Caribbean small states","CountryCode":"CSS","GNI":8909},{"CountryName":"Cyprus","CountryCode":"CYP","GNI":23720},
        {"CountryName":"Czech Republic","CountryCode":"CZE","GNI":18160},{"CountryName":"Germany","CountryCode":"DEU","GNI":43490},
        {"CountryName":"Djibouti","CountryCode":"DJI","GNI":1880},{"CountryName":"Dominica","CountryCode":"DMA","GNI":6590},{"CountryName":"Denmark","CountryCode":"DNK","GNI":55220},
        {"CountryName":"Dominican Republic","CountryCode":"DOM","GNI":6630},{"CountryName":"Algeria","CountryCode":"DZA","GNI":3940},
        {"CountryName":"East Asia & Pacific (excluding high income)","CountryCode":"EAP","GNI":6987},{"CountryName":"Early-demographic dividend","CountryCode":"EAR","GNI":3352},
        {"CountryName":"East Asia & Pacific","CountryCode":"EAS","GNI":10171},{"CountryName":"Europe & Central Asia (excluding high income)","CountryCode":"ECA","GNI":7375},
        {"CountryName":"Europe & Central Asia","CountryCode":"ECS","GNI":22656},{"CountryName":"Ecuador","CountryCode":"ECU","GNI":5920},
        {"CountryName":"Euro area","CountryCode":"EMU","GNI":35645},{"CountryName":"Spain","CountryCode":"ESP","GNI":27180},{"CountryName":"Estonia","CountryCode":"EST","GNI":18190},
        {"CountryName":"Ethiopia","CountryCode":"ETH","GNI":740},{"CountryName":"European Union","CountryCode":"EUU","GNI":32784},
        {"CountryName":"Fragile and conflict affected situations","CountryCode":"FCS","GNI":1510},{"CountryName":"Finland","CountryCode":"FIN","GNI":44580},
        {"CountryName":"Fiji","CountryCode":"FJI","GNI":4970},{"CountryName":"France","CountryCode":"FRA","GNI":37970},{"CountryName":"Gabon","CountryCode":"GAB","GNI":6650},
        {"CountryName":"United Kingdom","CountryCode":"GBR","GNI":40530},{"CountryName":"Georgia","CountryCode":"GEO","GNI":3780},{"CountryName":"Ghana","CountryCode":"GHA","GNI":1880},
        {"CountryName":"Guinea","CountryCode":"GIN","GNI":790},{"CountryName":"Guinea-Bissau","CountryCode":"GNB","GNI":660},
        {"CountryName":"Equatorial Guinea","CountryCode":"GNQ","GNI":7050},{"CountryName":"Greece","CountryCode":"GRC","GNI":18090},
        {"CountryName":"Grenada","CountryCode":"GRD","GNI":9180},{"CountryName":"Guatemala","CountryCode":"GTM","GNI":4060},{"CountryName":"Guyana","CountryCode":"GUY","GNI":4500},
        {"CountryName":"High income","CountryCode":"HIC","GNI":40142},{"CountryName":"Honduras","CountryCode":"HND","GNI":2250},{"CountryName":"Heavily indebted poor countries (HIPC)","CountryCode":"HPC","GNI":904},{"CountryName":"Croatia","CountryCode":"HRV","GNI":12570},{"CountryName":"Haiti","CountryCode":"HTI","GNI":760},{"CountryName":"Hungary","CountryCode":"HUN","GNI":12870},{"CountryName":"IBRD only","CountryCode":"IBD","GNI":5745},{"CountryName":"IDA & IBRD total","CountryCode":"IBT","GNI":4620},{"CountryName":"IDA total","CountryCode":"IDA","GNI":1313},{"CountryName":"IDA blend","CountryCode":"IDB","GNI":1791},
        {"CountryName":"Indonesia","CountryCode":"IDN","GNI":3540},{"CountryName":"IDA only","CountryCode":"IDX","GNI":1074},{"CountryName":"India","CountryCode":"IND","GNI":1800},{"CountryName":"Ireland","CountryCode":"IRL","GNI":55290},{"CountryName":"Iraq","CountryCode":"IRQ","GNI":4630},{"CountryName":"Iceland","CountryCode":"ISL","GNI":60830},{"CountryName":"Israel","CountryCode":"ISR","GNI":37270},{"CountryName":"Italy","CountryCode":"ITA","GNI":31020},{"CountryName":"Jamaica","CountryCode":"JAM","GNI":4760},{"CountryName":"Jordan","CountryCode":"JOR","GNI":3980},{"CountryName":"Japan","CountryCode":"JPN","GNI":38550},{"CountryName":"Kazakhstan","CountryCode":"KAZ","GNI":7970},{"CountryName":"Kenya","CountryCode":"KEN","GNI":1460},{"CountryName":"Kyrgyz Republic","CountryCode":"KGZ","GNI":1130},
        {"CountryName":"Cambodia","CountryCode":"KHM","GNI":1230},{"CountryName":"Kiribati","CountryCode":"KIR","GNI":3010},{"CountryName":"St. Kitts and Nevis","CountryCode":"KNA","GNI":16240},{"CountryName":"Kuwait","CountryCode":"KWT","GNI":31430},{"CountryName":"Latin America & Caribbean (excluding high income)","CountryCode":"LAC","GNI":7470},{"CountryName":"Lao PDR","CountryCode":"LAO","GNI":2270},{"CountryName":"Lebanon","CountryCode":"LBN","GNI":8400},{"CountryName":"Liberia","CountryCode":"LBR","GNI":620},{"CountryName":"Libya","CountryCode":"LBY","GNI":5500},{"CountryName":"St. Lucia","CountryCode":"LCA","GNI":8830},{"CountryName":"Latin America & Caribbean","CountryCode":"LCN","GNI":8251},{"CountryName":"Least developed countries: UN classification","CountryCode":"LDC","GNI":1011},{"CountryName":"Low income","CountryCode":"LIC","GNI":774},{"CountryName":"Sri Lanka","CountryCode":"LKA","GNI":3850},{"CountryName":"Lower middle income","CountryCode":"LMC","GNI":2118},{"CountryName":"Low & middle income","CountryCode":"LMY","GNI":4455},{"CountryName":"Lesotho","CountryCode":"LSO","GNI":1210},{"CountryName":"Late-demographic dividend","CountryCode":"LTE","GNI":8518},{"CountryName":"Lithuania","CountryCode":"LTU","GNI":15200},{"CountryName":"Luxembourg","CountryCode":"LUX","GNI":70260},{"CountryName":"Latvia","CountryCode":"LVA","GNI":14740},{"CountryName":"Morocco","CountryCode":"MAR","GNI":2860},{"CountryName":"Moldova","CountryCode":"MDA","GNI":2200},{"CountryName":"Madagascar","CountryCode":"MDG","GNI":400},{"CountryName":"Maldives","CountryCode":"MDV","GNI":9760},
        {"CountryName":"Middle East & North Africa","CountryCode":"MEA","GNI":7236},{"CountryName":"Mexico","CountryCode":"MEX","GNI":8610},{"CountryName":"Marshall Islands","CountryCode":"MHL","GNI":4840},{"CountryName":"Middle income","CountryCode":"MIC","GNI":4942},{"CountryName":"Mali","CountryCode":"MLI","GNI":770},
        {"CountryName":"Malta","CountryCode":"MLT","GNI":24080},{"CountryName":"Myanmar","CountryCode":"MMR","GNI":1210},{"CountryName":"Middle East & North Africa (excluding high income)","CountryCode":"MNA","GNI":3832},{"CountryName":"Montenegro","CountryCode":"MNE","GNI":7400},{"CountryName":"Mongolia","CountryCode":"MNG","GNI":3270},{"CountryName":"Mozambique","CountryCode":"MOZ","GNI":420},{"CountryName":"Mauritania","CountryCode":"MRT","GNI":1100},{"CountryName":"Mauritius","CountryCode":"MUS","GNI":10130},{"CountryName":"Malawi","CountryCode":"MWI","GNI":320},{"CountryName":"Malaysia","CountryCode":"MYS","GNI":9650},{"CountryName":"North America","CountryCode":"NAC","GNI":56721},{"CountryName":"Namibia","CountryCode":"NAM","GNI":4570},{"CountryName":"Niger","CountryCode":"NER","GNI":360},{"CountryName":"Nigeria","CountryCode":"NGA","GNI":2100},
        {"CountryName":"Nicaragua","CountryCode":"NIC","GNI":2130},{"CountryName":"Netherlands","CountryCode":"NLD","GNI":46180},{"CountryName":"Norway","CountryCode":"NOR","GNI":75990},{"CountryName":"Nepal","CountryCode":"NPL","GNI":800},{"CountryName":"Nauru","CountryCode":"NRU","GNI":10220},{"CountryName":"New Zealand","CountryCode":"NZL","GNI":38970},{"CountryName":"OECD members","CountryCode":"OED","GNI":37273},{"CountryName":"Oman","CountryCode":"OMN","GNI":14440},{"CountryName":"Other small states","CountryCode":"OSS","GNI":12199},{"CountryName":"Pakistan","CountryCode":"PAK","GNI":1580},{"CountryName":"Panama","CountryCode":"PAN","GNI":13280},{"CountryName":"Peru","CountryCode":"PER","GNI":5960},{"CountryName":"Philippines","CountryCode":"PHL","GNI":3660},{"CountryName":"Palau","CountryCode":"PLW","GNI":12700},{"CountryName":"Papua New Guinea","CountryCode":"PNG","GNI":2340},{"CountryName":"Poland","CountryCode":"POL","GNI":12730},{"CountryName":"Pre-demographic dividend","CountryCode":"PRE","GNI":1379},{"CountryName":"Portugal","CountryCode":"PRT","GNI":19820},{"CountryName":"Paraguay","CountryCode":"PRY","GNI":5470},{"CountryName":"West Bank and Gaza","CountryCode":"PSE","GNI":3180},{"CountryName":"Pacific island small states","CountryCode":"PSS","GNI":3793},{"CountryName":"Post-demographic dividend","CountryCode":"PST","GNI":41609},{"CountryName":"Qatar","CountryCode":"QAT","GNI":60510},{"CountryName":"Romania","CountryCode":"ROU","GNI":10000},{"CountryName":"Russian Federation","CountryCode":"RUS","GNI":9230},{"CountryName":"Rwanda","CountryCode":"RWA","GNI":720},{"CountryName":"South Asia","CountryCode":"SAS","GNI":1729},{"CountryName":"Saudi Arabia","CountryCode":"SAU","GNI":20090},{"CountryName":"Sudan","CountryCode":"SDN","GNI":2380},{"CountryName":"Senegal","CountryCode":"SEN","GNI":1240},{"CountryName":"Singapore","CountryCode":"SGP","GNI":54530},{"CountryName":"Solomon Islands","CountryCode":"SLB","GNI":1920},{"CountryName":"Sierra Leone","CountryCode":"SLE","GNI":510},{"CountryName":"El Salvador","CountryCode":"SLV","GNI":3560},{"CountryName":"Serbia","CountryCode":"SRB","GNI":5180},{"CountryName":"Sub-Saharan Africa (excluding high income)","CountryCode":"SSA","GNI":1485},{"CountryName":"Sub-Saharan Africa","CountryCode":"SSF","GNI":1486},{"CountryName":"Small states","CountryCode":"SST","GNI":11099},{"CountryName":"Sao Tome and Principe","CountryCode":"STP","GNI":1770},{"CountryName":"Suriname","CountryCode":"SUR","GNI":5150},{"CountryName":"Slovak Republic","CountryCode":"SVK","GNI":16610},{"CountryName":"Slovenia","CountryCode":"SVN","GNI":22000},{"CountryName":"Sweden","CountryCode":"SWE","GNI":52590},{"CountryName":"Eswatini","CountryCode":"SWZ","GNI":2950},{"CountryName":"Seychelles","CountryCode":"SYC","GNI":14170},{"CountryName":"Chad","CountryCode":"TCD","GNI":640},{"CountryName":"East Asia & Pacific (IDA & IBRD countries)","CountryCode":"TEA","GNI":7061},
        {"CountryName":"Europe & Central Asia (IDA & IBRD countries)","CountryCode":"TEC","GNI":7866},{"CountryName":"Togo","CountryCode":"TGO","GNI":610},{"CountryName":"Thailand","CountryCode":"THA","GNI":5950},{"CountryName":"Tajikistan","CountryCode":"TJK","GNI":990},{"CountryName":"Turkmenistan","CountryCode":"TKM","GNI":6380},{"CountryName":"Latin America & the Caribbean (IDA & IBRD countries)","CountryCode":"TLA","GNI":8179},{"CountryName":"Timor-Leste","CountryCode":"TLS","GNI":1790},{"CountryName":"Middle East & North Africa (IDA & IBRD countries)","CountryCode":"TMN","GNI":3839},{"CountryName":"Tonga","CountryCode":"TON","GNI":4010},{"CountryName":"South Asia (IDA & IBRD)","CountryCode":"TSA","GNI":1729},
        {"CountryName":"Sub-Saharan Africa (IDA & IBRD countries)","CountryCode":"TSS","GNI":1486},{"CountryName":"Trinidad and Tobago","CountryCode":"TTO","GNI":15340},{"CountryName":"Tunisia","CountryCode":"TUN","GNI":3490},{"CountryName":"Turkey","CountryCode":"TUR","GNI":10940},{"CountryName":"Tuvalu","CountryCode":"TUV","GNI":4970},{"CountryName":"Tanzania","CountryCode":"TZA","GNI":910},{"CountryName":"Uganda","CountryCode":"UGA","GNI":600},{"CountryName":"Ukraine","CountryCode":"UKR","GNI":2390},{"CountryName":"Upper middle income","CountryCode":"UMC","GNI":8197},{"CountryName":"Uruguay","CountryCode":"URY","GNI":15250},{"CountryName":"United States","CountryCode":"USA","GNI":58270},{"CountryName":"Uzbekistan","CountryCode":"UZB","GNI":2000},{"CountryName":"St. Vincent and the Grenadines","CountryCode":"VCT","GNI":7390},{"CountryName":"Vietnam","CountryCode":"VNM","GNI":2160},{"CountryName":"Vanuatu","CountryCode":"VUT","GNI":2920},{"CountryName":"World","CountryCode":"WLD","GNI":10371},{"CountryName":"Samoa","CountryCode":"WSM","GNI":4090},{"CountryName":"Kosovo","CountryCode":"XKX","GNI":3900},
        {"CountryName":"South Africa","CountryCode":"ZAF","GNI":5430},{"CountryName":"Zambia","CountryCode":"ZMB","GNI":1290},{"CountryName":"Zimbabwe","CountryCode":"ZWE","GNI":1170},
        {"CountryName":"Zimbabwe","CountryCode":"ZWE","GNI":1171}];

    const sortMethod = sortMethodWithDirectionMultiColumn(
        [
            { column: "GNI", direction: "asc" },
            { column: "CountryCode", direction: "desc" }
        ]
    );
    let sortedData = data.sort(sortMethod);  
    
    
    console.log("sorted by: 1)column:GNI-asc, 2)column:CountryCode-desc") 
    console.table(sortedData);
    console.log(sortedData);
    


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

0

আমি স্নাতক -সহায়ক ( গিথুবের উত্স ) নামে একটি মাইক্রো-লাইব্রেরি এনটিএম-এ প্রকাশ করেছি । ধারণাটি হ'ল সহায়তাকে সিনট্যাক্সের মাধ্যমে অ্যারে পদ্ধতির byতুলনা ফাংশন তৈরি করতে , কলামগুলি সাজানোর জন্য বিভিন্নভাবে প্রকাশ করার sortমাধ্যমে আমদানি items.sort(by(column, ...otherColumns))করা হবে:

  • কী দ্বারা :persons.sort(by('lastName', 'firstName')) ,
  • নির্বাচক দ্বারা :dates.sort(by(x => x.toISOString())) ,
  • ইন অর্ডার সাজানো : [3, 2, 4, 1].sort(by(desc(n => n)))[3, 2, 1, 0] ,
  • মামলা উপেক্ষা : ['B', 'D', 'c', 'a'].sort(by(ignoreCase(x => x))).join('')'aBcD'

এটি উত্তরের মতই এই উত্তরটিতে উল্লিখিত হলেও নিম্নলিখিত পার্থক্যগুলির সাথে যা কারওর স্বাদে আরও বেশি হতে পারে:

  • অবজেক্ট-ওরিয়েন্টেডের চেয়ে বেশি কার্যকরী একটি পদ্ধতির ( thenByসাবলীল এপিআই দেখুন) ,
  • একটি সিনট্যাক্সটি কিছুটা পরিলক্ষিত এবং এখনও তত পাঠযোগ্য, প্রায় এসকিউএল এর মতো প্রাকৃতিক।
  • প্রকার সুরক্ষা এবং টাইপ এক্সপ্রিভিটি থেকে উপকৃত হওয়ার জন্য, টাইপস্ক্রিপ্টে পুরোপুরি প্রয়োগ করা হয়েছে।
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.