स्तंभ मान द्वारा 2 आयामी सरणी कैसे सॉर्ट करें?


90

क्या कोई भी मुझे जावास्क्रिप्ट में 2 आयामी ऐरे को सॉर्ट करने में मदद कर सकता है?

यह निम्नलिखित प्रारूप में डेटा होगा:

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

छाँटे जाने पर इसे इस तरह दिखना चाहिए:

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

तो मूल रूप से, पहले कॉलम द्वारा छँटाई।

चियर्स


3
यहाँ वह सब कुछ है जो आपको जानना चाहिए: MDN - Array.sort ()
jahroy

1
कृपया @PramodVemulapalli का उत्तर स्वीकार करें, वर्तमान में उच्च मत वाले सभी गलत हैं!
बरगी

@ जहारॉय: यह प्रकार की जबरदस्ती के बारे में नहीं है, यह लगातार तुलना कार्यों के लिए आवश्यकताओं के बारे में है।
बरगी

जवाबों:


113

यह इतना आसान है:

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 । आपके द्वारा पोस्ट किए गए दस्तावेज़ीकरण लिंक से सीधे: "अगर तुलन की आपूर्ति नहीं की गई है, तो तत्वों को छंटनी और लेक्सिकोग्राफ़िक (" शब्दकोश "या" टेलीफोन बुक, "संख्यात्मक नहीं) क्रम में तार की तुलना करके हल किया जाता है। उदाहरण के लिए," 80 "आता है। लेक्सिकोग्राफ़िक क्रम में "9" से पहले, लेकिन एक संख्यात्मक क्रम में 9 80 से पहले आता है। "
इयान

3
@ इयान - आप सही कह रहे हैं। अच्छी बात। मुझे लगता है कि मैं सादगी के बारे में एक बात साबित करने के लिए अति उत्साहित हो गया। मैंने इसका परीक्षण किया, लेकिन पूरी तरह से नहीं। अब मैं इसे ठीक कर दूंगा ... काश नमूना डेटा आपकी बात को साबित करता इससे पहले कि मैं उस अंडे को मेरे चेहरे पर मारता!
जहरॉय

हाहा मुझे पता है मुझे पता है, मुझे नफरत है जब उस तरह की बात होती है। यह इतना सही लगता है, लेकिन कुछ आंतरिक रूप से इसे बदलता है जो अपेक्षा के अनुरूप नहीं करता है। Kinda के साथ तार की तुलना की तरह <या >। वैसे भी, मुझे अपडेट पसंद है :)
इयान

1
@Ash - देखने के लिए सबसे अच्छी जगह प्रलेखन है। मुझे मोज़िला का प्रलेखन पसंद है, इसलिए जब मेरे पास जेएस फ़ंक्शन के बारे में सवाल होता है तो मैं हमेशा "mdn {{functionname}}" Google करता हूं इस मामले में खोज शब्द "mdn array.sort" होगा जो आपको यहां लाता है
जहरॉय

1
... जैसा कि आप प्रलेखन में देखेंगे, array.sort () विधि एक फ़ंक्शन को तर्क के रूप में लेती है, जो जावास्क्रिप्ट में काफी सामान्य है। Array.sort () विधि एक तरह से यह जानता है कि समारोह में यह करने के लिए पारित कर दिया के साथ क्या करने के लिए बनाया गया है: यह इसे इस्तेमाल करता है उसके तत्वों की तुलना। यहाँ एक बहुत ही लंगड़ा फिडल है, जिसे मैंने यह दिखाने की कोशिश की कि आप संदर्भ के रूप में कैसे कार्य करते हैं ... क्षमा करें यह बहुत बुरा है।
जहरॉय

66

सबसे अच्छा तरीका निम्नलिखित का उपयोग करना होगा, क्योंकि पहले कॉलम में दोहराव वाले मूल्य हो सकते हैं।

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

यह सही उत्तर है, यह संख्या में दोनों अंकों को ध्यान में रखता है। धन्यवाद!
निक

53

इसे इस्तेमाल करे

//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 upvotes? मैं इस पर विश्वास नहीं कर सकता हूँ। कृपया, तुलनात्मक कार्यों के बारे में पढ़ें और समझें कि उन्हें नकारात्मक मूल्यों को वापस करने की आवश्यकता है।
बरगी

6
जैसा कि बर्गी ने कहा, यह सही समाधान नहीं है। हालांकि यह कई मामलों में काम कर सकता है, ऐसे समय होंगे जहां यह अपेक्षित रूप से काम नहीं करेगा और आप अपना सिर खरोंच कर रहे हैं (यह मेरे साथ हुआ है)। समस्या की जड़ यह है कि इस समाधान में तुलनात्मक फ़ंक्शन केवल दो राज्यों (सही / 1, गलत / 0) को लौटाता है, लेकिन इसे तीन राज्यों (शून्य, शून्य से अधिक और शून्य से कम) पर लौटाया जाना चाहिए।
शाम

1
मेरे लिए काम नहीं किया। @ जहारॉय सही उत्तर वाला व्यक्ति है
इरेडास्टर

टिप्पणियों को पढ़ने वालों के लिए बस एक नोट: उत्तर 5 जनवरी को सही किया गया था। यह अब ठीक है (तुलना फ़ंक्शन तीन संभावित राज्यों को लौटाता है)।
marlar

@Bergi, इसे इंगित करने के लिए धन्यवाद। (मेरे लिए, यह IE11 में ठीक से काम नहीं करता है) और मैं समझ नहीं पा रहा था (क्यों यह क्रोम में काम करता है) जब तक मैंने आपकी टिप्पणी नहीं देखी। धन्यवाद!
एलेक्स नेव्स्की

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"]]"

यह उत्तर यहाँ से अलग कैसे है ?
चार्ल्स क्लेटन

1
1. आप a[colIndex]बार-बार उपयोग कर रहे हैं लेकिन मैं इसे यहां पकड़ रहा हूं a = a[colIndex]। यह अधिक कुशल है। 2. मैं विभिन्न स्वादों का उपयोग कर रहा हूं if, जिससे यह अधिक छोटा हो जाता है। 3. मैं फ़ंक्शन के 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

जैसा कि मेरे usecase में दर्जनों कॉलम शामिल हैं, मैंने @ jahroy के उत्तर को थोड़ा विस्तारित किया। (यह भी एहसास हुआ कि @ charles- क्लेटन का भी यही विचार था।)
मैं उस पैरामीटर को पास करता हूं जिसे मैं क्रमबद्ध करना चाहता हूं, और उस पर जगह लेने के लिए वांछित फ़ंक्शन के साथ सॉर्ट फ़ंक्शन को फिर से परिभाषित किया जाता है।

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)हमेशा गलत वापस आएगा। एमडीएन यहां देखें

यह Google अनुप्रयोग स्क्रिप्ट का उपयोग करके लकड़हारा परीक्षण के साथ पूरी स्क्रिप्ट है।

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
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.