Строка ошибки «Ссылка на объект, не установленная на экземпляр объекта.» указывает, что вы не назначили экземпляр объекта объектной ссылке, и все же вы получаете доступ к свойствам / методам этого объекта.
например: скажем, у вас есть класс под названием myClass и он содержит одно свойство prop1.
public Class myClass
{
public int prop1 {get;set;}
}
Теперь вы получаете доступ к этому prop1 в каком-то другом классе, как показано ниже:
public class Demo
{
public void testMethod()
{
myClass ref = null;
ref.prop1 = 1; //This line throws error
}
}
выше строки выдает ошибку, потому что ссылка класса myClass объявлена, но не создана, или экземпляр объекта не назначается referecne этого класса.
Чтобы исправить это, вам нужно создать экземпляр (присвоить объект ссылке на этот класс).
public class Demo
{
public void testMethod()
{
myClass ref = null;
ref = new myClass();
ref.prop1 = 1;
}
}
var reA = /[^a-zA-Z]/g;
var reN = /[^0-9]/g;
function sortAlphaNum(a, b) {
var aA = a.replace(reA, "");
var bA = b.replace(reA, "");
if (aA === bA) {
var aN = parseInt(a.replace(reN, ""), 10);
var bN = parseInt(b.replace(reN, ""), 10);
return aN === bN ? 0 : aN > bN ? 1 : -1;
} else {
return aA > bA ? 1 : -1;
}
}
console.log(
["A1", "A10", "A11", "A12", "A2", "A3", "A4", "B10", "B2", "F1", "F12", "F3"].sort(sortAlphaNum)
)
function sortAlphaNum(a, b) {
var smlla = a.toLowerCase();
var smllb = b.toLowerCase();
var result = smlla > smllb ? 1 : -1;
return result;
}
У меня была аналогичная ситуация, но у меня была смесь буквенно-цифровых & amp; числовое значение и необходимо отсортировать все числовые сначала, а затем буквенно-числовые, поэтому:
A10
1
5
A9
2
B3
A2
необходимо стать:
1
2
5
A2
A9
A10
B3
Я смог использовать предоставленный алгоритм и немного взломать более того, чтобы выполнить это:
var reA = /[^a-zA-Z]/g;
var reN = /[^0-9]/g;
function sortAlphaNum(a,b) {
var AInt = parseInt(a, 10);
var BInt = parseInt(b, 10);
if(isNaN(AInt) && isNaN(BInt)){
var aA = a.replace(reA, "");
var bA = b.replace(reA, "");
if(aA === bA) {
var aN = parseInt(a.replace(reN, ""), 10);
var bN = parseInt(b.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;
}
}
var newlist = ["A1", 1, "A10", "A11", "A12", 5, 3, 10, 2, "A2", "A3", "A4", "B10", "B2", "F1", "F12", "F3"].sort(sortAlphaNum);
Ниже приведен пример обновления ES6 TypScript для этого ответа.
export function SortAlphaNum(a: string, b: string) {
const reA = /[^a-zA-Z]/g;
const reN = /[^0-9]/g;
const aA = a.replace(reA, "");
const bA = b.replace(reA, "");
if (aA === bA) {
const aN = parseInt(a.replace(reN, ""), 10);
const bN = parseInt(b.replace(reN, ""), 10);
return aN === bN ? 0 : aN > bN ? 1 : -1;
} else {
return aA > bA ? 1 : -1;
}
}
alphaNumericCompare(a, b) {
let 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) {
let an = ax.shift();
let bn = bx.shift();
let nn = (an[0] - bn[0]) || an[1].localeCompare(bn[1]);
if (nn) {
return nn;
}
}
return ax.length - bx.length;
}
Это могло бы сделать это:
function parseItem (item) {
const [, stringPart = '', numberPart = 0] = /(^[a-zA-Z]*)(\d*)$/.exec(item) || [];
return [stringPart, numberPart];
}
function sort (array) {
return array.sort((a, b) => {
const [stringA, numberA] = parseItem(a);
const [stringB, numberB] = parseItem(b);
const comparison = stringA.localeCompare(stringB);
return comparison === 0 ? Number(numberA) - Number(numberB) : comparison;
});
}
console.log(sort(['A1', 'A10', 'A11', 'A12', 'A2', 'A3', 'A4', 'B10', 'B2', 'F1', 'F12', 'F3']))
Только проблема с вышеприведенным решением заключалась в том, что логика завершилась неудачно, когда числовые данные были одинаковыми и amp; алфавиты варьировались, например. 28AB, 28PQR, 28HBC. Вот модифицированный код.
var reA = /[^a-zA-Z]/g;
var reN = /[^0-9]/g;
var AInt = parseInt(a, 10);
var BInt = parseInt(b, 10);
if(isNaN(AInt) && isNaN(BInt)){
var aA = a.replace(reA, "");
var bA = b.replace(reA, "");
if(aA === bA) {
var aN = parseInt(a.replace(reN, ""), 10);
var bN = parseInt(b.replace(reN, ""), 10);
alert("in if "+aN+" : "+bN);
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 if(AInt == BInt) {
var aA = a.replace(reA, "");
var bA = b.replace(reA, "");
return aA > bA ? 1 : -1;
}
else {
return AInt > BInt ? 1 : -1;
}
const sortAlphaNum = (a, b) => a.localeCompare(b, 'en', { numeric: true })
Использование:
['A1', 'A10', 'A11', 'A12', 'A2', 'A3', 'A4', 'B10', 'B2', 'F1', 'F12', 'F3'].sort(sortAlphaNum)
Дает:
["A1", "A2", "A3", "A4", "A10", "A11", "A12", "B2", "B10", "F1", "F3", "F12"]
Возможно, вам придется изменить аргумент 'en'
в свою локаль или определить программно, но это работает для английских строк.
Также localeCompare
не поддерживается очень последовательно, но если ваша пересылка с помощью babel, t - проблема
var a1 =["A1", "A10", "A11", "A12", "A2", "A3", "A4", "B10", "B2", "F1", "F12", "F3"];
var a2 = a1.sort(function(a,b){
var charPart = [a.substring(0,1), b.substring(0,1)],
numPart = [a.substring(1)*1, b.substring(1)*1];
if(charPart[0] < charPart[1]) return -1;
else if(charPart[0] > charPart[1]) return 1;
else{ //(charPart[0] == charPart[1]){
if(numPart[0] < numPart[1]) return -1;
else if(numPart[0] > numPart[1]) return 1;
return 0;
}
});
$('#r').html(a2.toString())
Добавление к принятому ответу от epascarello, так как я не могу его прокомментировать. Я все еще здесь. Когда один из строк не имеет номера, исходный ответ не будет работать. Например, A и A10 не будут сортироваться в этом порядке. Следовательно, вы можете wamnt вернуться к нормальной сортировке в этом случае.
var reA = /[^a-zA-Z]/g;
var reN = /[^0-9]/g;
function sortAlphaNum(a,b) {
var aA = a.replace(reA, "");
var bA = b.replace(reA, "");
if(aA === bA) {
var aN = parseInt(a.replace(reN, ""), 10);
var bN = parseInt(b.replace(reN, ""), 10);
if(isNaN(bN) || isNaN(bN)){
return a > b ? 1 : -1;
}
return aN === bN ? 0 : aN > bN ? 1 : -1;
} else {
return aA > bA ? 1 : -1;
}
}
["A1", "A10", "A11", "A12", "A2", "A3", "A4", "B10", "B2", "F1", "F12","F3"].sort(sortAlphaNum);`
Я решил эту проблему сортировки с ниже сценария
arrVals.sort(function(a, b){
//return b.text - a.text;
var AInt = parseInt(a.text, 10);
var BInt = parseInt(b.text, 10);
if ($.isNumeric(a.text) == false && $.isNumeric(b.text) == false) {
var aA = a.text
var bA = b.text;
return aA > bA ? 1 : -1;
} else if ($.isNumeric(a.text) == false) { // A is not an Int
return 1; // to make alphanumeric sort first return -1 here
} else if ($.isNumeric(b.text) == false) { // B is not an Int
return -1; // to make alphanumeric sort first return 1 here
} else {
return AInt < BInt ? 1 : -1;
}
});
Это отлично работает для хорошо смешанного массива .:)
Спасибо.