2017-02-01 5 views
8

मैं एक मिश्रित सरणी है कि मैं digit-कैसे मिश्रित सांख्यिक/अक्षरांकीय सरणी जावास्क्रिप्ट में

['A1', 'A10', 'A11', 'A12', 'A3A', 'A3B', 'A3', 'A4', 'B10', 'B2', 'F1', '1', '2', 'F3'] 

द्वारा नंबर, वर्णमाला के आधार पर सॉर्ट और उसके बाद की जरूरत है सॉर्ट करने के लिए कैसे मैं इसे होने की क्रमित करूं तरह:

['1', '2', 'A1', 'A2', 'A3', 'A3A', 'A3B', 'A4', 'A10', 'A11', 'A12', 'B2', 'B10', 'F1', 'F3'] 

यहाँ मैं क्या करने की कोशिश की है:

var reA = /[^a-zA-Z]/g; 
var reN = /[^0-9]/g; 
function sortAlphaNum(a, b) { 
    var AInt = parseInt(a.Field, 10); 
    var BInt = parseInt(b.Field, 10); 

    if (isNaN(AInt) && isNaN(BInt)) { 
     var aA = (a.Field).replace(reA, ""); 
     var bA = (b.Field).replace(reA, ""); 
     if (aA === bA) { 
      var aN = parseInt((a.Field).replace(reN, ""), 10); 
      var bN = parseInt((b.Field).replace(reN, ""), 10); 
      return aN === bN ? 0 : aN > bN ? 1 : -1; 
     } else { 
      return aA > bA ? 1 : -1; 
     } 
    } else if (isNaN(AInt)) {//A is not an Int 
     return 1;//to make alphanumeric sort first return -1 here 
    } else if (isNaN(BInt)) {//B is not an Int 
     return -1;//to make alphanumeric sort first return 1 here 
    } else { 
     return AInt > BInt ? 1 : -1; 
    } 
} 

fieldselecteddata.sort(sortAlphaNum); 

लेकिन यह है कि केवल यह वर्णानुक्रम क्रमबद्ध करता/1 सांख्यिक एक के संयोजन तक सांख्यिक डी 1 चरित्र जैसे A1, A2, A10। लेकिन अगर A3A, A3B जैसे मान होंगे, तो यह ठीक से सॉर्ट नहीं होगा। क्या यह सीधे जावास्क्रिप्ट या jQuery के साथ किया जा सकता है?

+0

@RameshRajendran कि ** नहीं ** एक विषय से हटकर सवाल के लिए एक वैध बहाना, यह वास्तव में विषय पर और एक अच्छा सवाल है। इससे कोई फर्क नहीं पड़ता कि यह एक होमवर्क सवाल है या नहीं। प्रयोक्ता ने एक प्रयास किए गए समाधान के साथ एक स्पष्ट लक्ष्य और आउटपुट प्रस्तुत किया। यह तब बेहतर है जब मैं यहां देखे जाने वाले अधिकांश प्रश्न। –

+0

@RameshRajendran यह वास्तव में एक बहुत अच्छा सवाल है। इसे बंद करने के बजाय संरक्षित किया जाना चाहिए। –

उत्तर

2

var arr = ['A1', 'A10', 'A11', 'A12', 'A3A', 'A3B', 'A3', 'A4', 'B10', 'B2', 'F1', '1', '2', 'F3']; 
 

 
// regular expression to get the alphabetic and the number parts, if any 
 
var regex = /^([a-z]*)(\d*)/i; 
 

 
function sortFn(a, b) { 
 
    var _a = a.match(regex); 
 
    var _b = b.match(regex); 
 

 
    // if the alphabetic part of a is less than that of b => -1 
 
    if (_a[1] < _b[1]) return -1; 
 
    // if the alphabetic part of a is greater than that of b => 1 
 
    if (_a[1] > _b[1]) return 1; 
 

 
    // if the alphabetic parts are equal, check the number parts 
 
    var _n = parseInt(_a[2]) - parseInt(_b[2]); 
 
    if(_n == 0) // if the number parts are equal start a recursive test on the rest 
 
     return sortFn(a.substr(_a[0].length), b.substr(_b[0].length)); 
 
    // else, just sort using the numbers parts 
 
    return _n; 
 
} 
 

 
console.log(arr.sort(sortFn));

नोट: नियमित अभिव्यक्ति (/.../i) में i संशोधक का मतलब केस-संवेदी (दोनों lowercases और uppercases के लिए लग रहा है)।

+0

क्या ओपी exceptation है के साथ उत्पादन बेमेल '" A1 ", " A3A ", " A3B ", " ए 3 ", ' –

+1

@RameshRajendran मैं इसे तय की। –

0

इस कार्यक्षमता को आजमाएं। यह परिणाम दे कि वास्तव में आप

var arr = ['A1', 'A10', 'A11', 'A12', 'A3A', 'A3B', 'A3', 'A4', 'B10', 'B2', 'F1', '1', '2', 'F3']; 
 
function sortFn(a, b) {  
 
    var ax = [], bx = []; 
 
    a.replace(/(\d+)|(\D+)/g, function(_, $1, $2) { ax.push([$1 || Infinity, $2 || ""]) }); 
 
    b.replace(/(\d+)|(\D+)/g, function(_, $1, $2) { bx.push([$1 || Infinity, $2 || ""]) });   
 
    while(ax.length && bx.length) { 
 
     var an = ax.shift(); 
 
     var bn = bx.shift(); 
 
     var nn = (an[0] - bn[0]) || an[1].localeCompare(bn[1]); 
 
     if(nn) return nn; 
 
    } 
 
    return ax.length - bx.length;  
 
} 
 
console.log(arr.sort(sortFn));

0

चाहते जो आप प्रकार से splitted सरणी के साथ यह सॉर्ट और प्रकार से पहले और उसके बाद समानता के लिए जाँच कर सकते हैं।

var array = ['A1', 'A10', 'A11', 'A12', 'A3A', 'A3B', 'A3', 'A4', 'B10', 'B2', 'F1', '1', '2', 'F3']; 
 

 
array.sort(function (a, b) { 
 
    var isNumber = function (v) { return (+v).toString() === v; }, 
 
     aa = a.match(/\d+|\D+/g), 
 
     bb = b.match(/\d+|\D+/g), 
 
     i = 0, 
 
     l = Math.min(aa.length, bb.length); 
 

 
    while (i < l && aa[i] === bb[i]) { 
 
     i++; 
 
    } 
 
    if (i === l) { 
 
     return aa.length - bb.length; 
 
    } 
 
    if (isNumber(aa[i]) && isNumber(bb[i])) { 
 
     return aa[i] - bb[i]; 
 
    } 
 
    return aa[i].localeCompare(bb[i]); 
 
}); 
 

 
console.log(array);
.as-console-wrapper { max-height: 100% !important; top: 0; }

0
var a=[ { 
    "LIST": "14:NATURAL RESOURCES" 
}, 
{ 
    "LIST": "7:DIVERSITY IN LIVING ORGANISMS" 
}, 
{ 
    "LIST": "3:ATOMS AND MOLECULES" 
}, 
{ 
    "LIST": "10:GRAVITATION" 
}, 
{ 
    "LIST": "6:TISSUES" 
}] 

var c=a.sort(function(a,b){ 
let aa=a.LIST,bb=b.LIST; 
return parseInt(aa.split(":")[0] - bb.split(":")[0]) 

}) 

console.log(c) 
संबंधित मुद्दे