কলাম মান অনুসারে 2 মাত্রিক অ্যারে বাছাই কিভাবে?


90

কেউ কি আমাকে জাভাস্ক্রিপ্টে 2 মাত্রিক অ্যারে বাছাই করতে সহায়তা করতে পারে?

এটিতে নিম্নলিখিত ফর্ম্যাটে ডেটা থাকবে:

[12, AAA]
[58, BBB]
[28, CCC]
[18, DDD]

বাছাই করার সময় এটি দেখতে এ জাতীয় দেখাচ্ছে:

[12, AAA]
[18, DDD]
[28, CCC]
[58, BBB]

সুতরাং মূলত, প্রথম কলাম অনুসারে বাছাই।

চিয়ার্স


4
আপনার যা জানা দরকার তা এখানে: এমডিএন - অ্যারে.সোর্ট ()
জহরোয়

4
দয়া করে @ প্রমোদভেমুলাপল্লীর উত্তরটি গ্রহণ করুন, বর্তমানে উচ্চ-ভোটপ্রাপ্তরা সকলেই ভুল!
বার্গি

@ জহরয়: এটি ধরণের জবরদস্তি সম্পর্কে নয়, এটি সামঞ্জস্যপূর্ণ তুলনা কার্যকারিতার প্রয়োজনীয়তা সম্পর্কে।
বেরগি

উত্তর:


110

এটি সহজ:

var a = [[12, 'AAA'], [58, 'BBB'], [28, 'CCC'],[18, 'DDD']];

a.sort(sortFunction);

function sortFunction(a, b) {
    if (a[0] === b[0]) {
        return 0;
    }
    else {
        return (a[0] < b[0]) ? -1 : 1;
    }
}

আমি আপনাকে ডকুমেন্টেশন পড়ার আমন্ত্রণ জানাচ্ছি ।

আপনি যদি দ্বিতীয় কলাম অনুসারে বাছাই করতে চান তবে আপনি এটি করতে পারেন:

a.sort(compareSecondColumn);

function compareSecondColumn(a, b) {
    if (a[1] === b[1]) {
        return 0;
    }
    else {
        return (a[1] < b[1]) ? -1 : 1;
    }
}

4
দয়া করে আপনার কোডটি পরীক্ষা করুন। jsfiddle.net/DuR4B/2 । আপনার পোস্ট করা ডকুমেন্টেশন লিঙ্কটি থেকে সরাসরি: "যদি তুলনা ফাংশন সরবরাহ না করা হয়, উপাদানগুলি স্ট্রিংগুলিতে রূপান্তরিত করে এবং ডিক্সোগ্রাফিক (" অভিধান "বা" টেলিফোন বই, "সংখ্যাগত নয়) ক্রমে স্ট্রিংগুলির তুলনা করে সাজানো হয় For উদাহরণস্বরূপ," 80 "আসে "9" এর আগে অভিধানিক ক্রমে, তবে একটি 9 সংখ্যাটি 9 এর আগে আসে ""
আয়ান

4
@ আইয়ান - আপনি ঠিক বলেছেন। ভাল যুক্তি. আমি অনুমান করি যে সরলতার বিষয়ে একটি বিষয় প্রমাণ করতে আমি অতিরিক্ত উত্তেজিত হয়েছি। আমি এটি পরীক্ষা করেছিলাম, কিন্তু পুরোপুরি না। এখন আমি এটি ঠিক করব ... আমি আশা করি যে আমার মুখের সমস্ত ডিমের গন্ধ নেওয়ার আগে নমুনা তথ্যটি আপনার পয়েন্টটি প্রমাণ করে!
jahroy

হাহা আমি জানি আমি জানি, যখন এই জাতীয় জিনিস ঘটে তখন আমি ঘৃণা করি। এটি দেখতে খুব ঠিক দেখাচ্ছে তবে অভ্যন্তরীণভাবে এমন কিছু এটি পরিবর্তন করে যা প্রত্যাশার মতো হয় না। কিন্ডার সাথে স্ট্রিংগুলির তুলনা <বা পছন্দ করে >। যাইহোক, আমি আপডেটটি পছন্দ করি :)
আয়ান

4
@ আশ - সন্ধানের সেরা জায়গা হ'ল ডকুমেন্টেশন। আমি মজিলার ডকুমেন্টেশন পছন্দ করি, সুতরাং যখন আমার কাছে কোনও জেএস ফাংশন সম্পর্কে প্রশ্ন থাকে আমি সর্বদা "mdn {{ফাংশন_নাম} g" গুগল করি this এই ক্ষেত্রে অনুসন্ধান শব্দটি "এমডিএন অ্যারে.সোর্ট" হবে যা আপনাকে এখানে নিয়ে আসে ।
jahroy

4
... আপনি ডকুমেন্টেশনে যেমন দেখবেন, অ্যারে.সোর্ট () পদ্ধতিটি আর্গুমেন্ট হিসাবে একটি ফাংশন গ্রহণ করে যা জাভাস্ক্রিপ্টে মোটামুটি সাধারণ। Array.sort () পদ্ধতি একটি উপায় তা জানেন যে কি ফাংশন এটি পাশ না করার জন্য ডিজাইন করা হয়: এটি এটি ব্যবহার করে তার উপাদান তুলনা। রেফারেন্স হিসাবে আপনি কীভাবে ফাংশনগুলি পাস করবেন তা প্রদর্শনের চেষ্টা করার জন্য আমি এখানে একটি সত্যিই খোঁড়া ঝাঁকুনি দিচ্ছি ... দুঃখিত এটি খুব খারাপ।
jahroy

65

নিম্নলিখিতটি ব্যবহার করা সবচেয়ে ভাল উপায় হবে কারণ প্রথম কলামে পুনরাবৃত্তি মান থাকতে পারে।

var arr = [[12, 'AAA'], [12, 'BBB'], [12, 'CCC'],[28, 'DDD'], [18, 'CCC'],[12, 'DDD'],[18, 'CCC'],[28, 'DDD'],[28, 'DDD'],[58, 'BBB'],[68, 'BBB'],[78, 'BBB']];

arr.sort(function(a,b) {
    return a[0]-b[0]
});

এটি সঠিক উত্তর, এটি সংখ্যার দুটি সংখ্যা বিবেচনা করে। ধন্যবাদ!
নিক

52

এটা চেষ্টা কর

//WITH FIRST COLUMN
arr = arr.sort(function(a,b) {
    return a[0] - b[0];
});


//WITH SECOND COLUMN
arr = arr.sort(function(a,b) {
    return a[1] - b[1];
});

দ্রষ্টব্য: আসল উত্তরটি বিয়োগ (-) এর পরিবর্তে (>) এর চেয়ে বেশি ব্যবহার করেছে যা মন্তব্যগুলিকেই ভুল হিসাবে উল্লেখ করছে।


8
একটি সুস্পষ্ট ভুল সমাধানের জন্য 8 টি আপভোটস? আমি এটা বিশ্বাস করতে পারছি না. দয়া করে তুলনা ফাংশন সম্পর্কে পড়ুন এবং কখন তাদের নেতিবাচক মানগুলি ফেরত দরকার তা বুঝতে পারেন।
বার্গি

6
যেমন বার্গি বলেছেন, এটি সঠিক সমাধান নয়। যদিও এটি অনেক ক্ষেত্রে কাজ করতে পারে, এমন সময় আসবে যেখানে এটি প্রত্যাশা অনুযায়ী কাজ করবে না এবং আপনি আপনার মাথা আঁচড়ানো ছেড়ে চলেছেন (এটি আমার ক্ষেত্রে হয়েছে)। সমস্যার সমাধানটি হ'ল এই সমাধানের তুলনা ফাংশনটি কেবল দুটি রাজ্য (সত্য / 1, মিথ্যা / 0) প্রদান করে তবে এটি তিনটি রাজ্যে (শূন্য, শূন্যের চেয়ে বড় এবং শূন্যের চেয়ে কম) ফিরে আসবে।
thordan

4
আমার পক্ষে কাজ করেনি। @jahroy সঙ্গে সঠিক উত্তরটি মানুষ
erdomester

যারা মন্তব্য পড়ছেন তাদের জন্য কেবল একটি নোট: উত্তরটি ৫ জানুয়ারী সংশোধন করা হয়েছিল এটি এখন সঠিক (তুলনা ফাংশনটি তিনটি সম্ভাব্য রাজ্য ফেরৎ দেয়)।
মারারার

@ বেরগি, এটি নির্দেশ করার জন্য আপনাকে ধন্যবাদ। (আমার জন্য, এটি আইই 11 তে সঠিকভাবে কাজ করে না) এবং আমি আপনার মন্তব্য না দেখা পর্যন্ত আমি বুঝতে পারি না (এটি ক্রোমে কেন কাজ করে)। ধন্যবাদ!
অ্যালেক্স নেভস্কি

12

তীর ফাংশনটি ব্যবহার করে এবং দ্বিতীয় স্ট্রিংয়ের ক্ষেত্র অনুসারে বাছাই করা

var a = [[12, 'CCC'], [58, 'AAA'], [57, 'DDD'], [28, 'CCC'],[18, 'BBB']];
a.sort((a, b) => a[1].localeCompare(b[1]));
console.log(a)


10

আপনি যদি আমার মতো কিছু হন তবে প্রতিবার আপনি যে কলামটি বাছাই করছেন তা বদলাতে চাইলে প্রতিটি সূচী পরিবর্তন করতে চান না।

function sortByColumn(a, colIndex){

    a.sort(sortFunction);

    function sortFunction(a, b) {
        if (a[colIndex] === b[colIndex]) {
            return 0;
        }
        else {
            return (a[colIndex] < b[colIndex]) ? -1 : 1;
        }
    }

    return a;
}

var sorted_a = sortByColumn(a, 2);

আমি ঠিক আপনার উত্তরটি দেখেছি, উত্তরটি সঠিক একই যুক্তি দিয়ে নিজেকে খসড়া দেওয়ার পরে - একটি সামান্য পার্থক্য সহ - আমি আসলে সরাসরি সাজানোর জন্য ফাংশনটি ফিরিয়ে দিই।
ওলমোটে

3

বিশেষ কিছু নয়, কেবলমাত্র অ্যারে থেকে নির্দিষ্ট সূচীতে একটি মান ফেরত নিতে যে খরচ লাগে তা সংরক্ষণ করে।

function sortByCol(arr, colIndex){
    arr.sort(sortFunction)
    function sortFunction(a, b) {
        a = a[colIndex]
        b = b[colIndex]
        return (a === b) ? 0 : (a < b) ? -1 : 1
    }
}
// Usage
var a = [[12, 'AAA'], [58, 'BBB'], [28, 'CCC'],[18, 'DDD']]
sortByCol(a, 0)
console.log(JSON.stringify(a))
// "[[12,"AAA"],[18,"DDD"],[28,"CCC"],[58,"BBB"]]"

এই উত্তরটি এখানে আমার থেকে কীভাবে আলাদা ?
চার্লস ক্লেটন

4
1. আপনি a[colIndex]বারবার ব্যবহার করছেন তবে আমি এটি এখানে ধরছি a = a[colIndex]। এটি আরও দক্ষ ২. আমি বিভিন্ন স্বাদ ব্যবহার করছি if, এটিকে আরও খাটো করে তুলছি। ৩. ফাংশনের arrফলে আমি ফিরছি না sortByColযার অর্থ আমার ফাংশনটি অন্য রেফারেন্স তৈরি করতে ব্যবহার করা যাবে না। আশা করি এটা সাহায্য করবে!
বিকাশ গৌতম

3

এক লাইনে:

var cars = [
  {type:"Volvo", year:2016},
  {type:"Saab", year:2001},
  {type:"BMW", year:2010}
]


function myFunction() {
  return cars.sort((a, b)=> a.year - b.year)
}

3

যদি আপনি প্রথম কলামের উপর ভিত্তি করে বাছাই করতে চান (এতে সংখ্যার মান রয়েছে ), তবে এটি চেষ্টা করুন:

arr.sort(function(a,b){
  return a[0]-b[0]
})

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

arr.sort(function(a,b){
  return a[1].charCodeAt(0)-b[1].charCodeAt(0)
})

দ্বিতীয় ক্ষেত্রে PS, আপনাকে তাদের ASCII মানগুলির মধ্যে তুলনা করতে হবে।

আশাকরি এটা সাহায্য করবে.


0

যেহেতু আমার ব্যবহারে কয়েক ডজন কলাম জড়িত, তাই আমি @ জহরয়ের উত্তরটি কিছুটা প্রসারিত করেছি। (এটি ঠিক বুঝতে পেরেছিল @ চার্লস-ক্লেটনও একই ধারণা পেয়েছিল))
আমি যে প্যারামিটারটি অনুসারে বাছাই করতে চাই তা পাস করি এবং তুলনা করার জন্য সাজ্ট ফাংশনটি পছন্দসই সূচকের সাথে পুনরায় সংজ্ঞায়িত করা হয়।

var ID_COLUMN=0
var URL_COLUMN=1

findings.sort(compareByColumnIndex(URL_COLUMN))

function compareByColumnIndex(index) {
  return function(a,b){
    if (a[index] === b[index]) {
        return 0;
    }
    else {
        return (a[index] < b[index]) ? -1 : 1;
    }
  }
}

0

চার্লস-ক্লেটন এবং @ বিকাশ-গৌতমের কাঁধে দাঁড়িয়ে আমি স্ট্রিং টেস্টটি যুক্ত করেছিলাম যা কোনও কলামে ওপি-র মতো স্ট্রিং থাকলে প্রয়োজন হয়।

return isNaN(a-b) ? (a === b) ? 0 : (a < b) ? -1 : 1 : a-b  ;

isNaN(a-b)স্ট্রিং সংখ্যার সাথে জোর করা যায় না কিনা তা পরীক্ষাটি নির্ধারণ করে। যদি তারা পারেন তবে a-bপরীক্ষাটি বৈধ।

নোট করুন যে মিশ্র প্রকারের কলামটি বাছাই করা সর্বদা একটি আনন্দদায়ক ফলাফল দেয় কারণ কঠোর সাম্যতা পরীক্ষা (a === b)সর্বদা মিথ্যা ফেরত আসবে। এমডিএন এখানে দেখুন

গুগল অ্যাপস স্ক্রিপ্ট ব্যবহার করে - এটি লগার পরীক্ষার সাথে সম্পূর্ণ স্ক্রিপ্ট।

function testSort(){

function sortByCol(arr, colIndex){
    arr.sort(sortFunction);
    function sortFunction(a, b) {
        a = a[colIndex];
        b = b[colIndex];
       return isNaN(a-b) ? (a === b) ? 0 : (a < b) ? -1 : 1 : a-b  ;  // test if text string - ie cannot be coerced to numbers.
       // Note that sorting a column of mixed types will always give an entertaining result as the strict equality test will always return false
       // see https://developer.mozilla.org/en-US/docs/Web/JavaScript/Equality_comparisons_and_sameness

       }
}
// Usage
var a = [ [12,'12', 'AAA'],
          [12,'11', 'AAB'],
          [58,'120', 'CCC'],
          [28,'08', 'BBB'],
          [18,'80', 'DDD'],
        ]
    var arr1 = a.map(function (i){return i;}).sort();  // use map to ensure tests are not corrupted by a sort in-place.

    Logger.log("Original unsorted:\n     " + JSON.stringify(a));
    Logger.log("Vanilla sort:\n     " + JSON.stringify(arr1));
    sortByCol(a, 0);
    Logger.log("By col 0:\n     " + JSON.stringify(a));
    sortByCol(a, 1);
    Logger.log("By col 1:\n     " + JSON.stringify(a));
    sortByCol(a, 2);
    Logger.log("By col 2:\n     " + JSON.stringify(a));

/* vanilla sort returns " [
                            [12,"11","AAB"],
                            [12,"12","AAA"],
                            [18,"80","DDD"],
                            [28,"08","BBB"],
                            [58,"120","CCC"]
                          ]
   if col 0 then returns "[
                            [12,'12',"AAA"],
                            [12,'11', 'AAB'],
                            [18,'80',"DDD"],
                            [28,'08',"BBB"],
                            [58,'120',"CCC"]
                          ]"
   if col 1 then returns "[
                            [28,'08',"BBB"],
                            [12,'11', 'AAB'],
                            [12,'12',"AAA"],
                            [18,'80',"DDD"],
                            [58,'120',"CCC"],

                          ]"
   if col 2 then returns "[
                            [12,'12',"AAA"],
                            [12,'11', 'AAB'],
                            [28,'08',"BBB"],
                            [58,'120',"CCC"],
                            [18,'80',"DDD"],
                          ]"
*/

}

সম্ভাব্য সুদের আপডেট - 2 শে জুলাই, 2019. বাছাই এখন 'স্থিতিশীল'। এখানে পড়ুন। (ম্যাথিয়াস বাইনেন্স যাচাইকৃত @ মথিয়াসের মাধ্যমে) v8.dev/features/stable-sort
DeeKay789
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.