Сортировка массива объектов по алфавиту по свойству со специальными символами [дубликат]

Ну, простыми словами:

Вы пытаетесь получить доступ к объекту, который не создан или в настоящее время не находится в памяти.

Итак, как это решить:

  1. Отладить и отпустить отладчик ... Он сразу приведет вас к переменной, которая сломана ... Теперь ваша задача - просто исправить это. Используя новое ключевое слово в соответствующем месте.
  2. Если это вызвано некоторыми командами базы данных, потому что объект отсутствует, все, что вам нужно сделать, это выполнить нулевую проверку и обработать его:
    if (i == null) {
        // Handle this
    }
    
  3. Самый сложный. если GC уже собрал объект ... Это обычно происходит, если вы пытаетесь найти объект, используя строки ... То есть, найдя его по имени объекта, может случиться, что GC, возможно, уже очистил его ... Это трудно найти и станет проблемой. Лучшим способом решения этой проблемы является выполнение нулевых проверок везде, где это необходимо в процессе разработки. Это сэкономит вам много времени.

Поиск по имени означает, что некоторые фреймворки позволяют использовать FIndObjects с помощью строк, а код может выглядеть так: FindObject («ObjectName»);

21
задан Andrej Kaurin 2 August 2011 в 09:21
поделиться

3 ответа

Если локаль в вашей системе настроена правильно, вы можете использовать метод localeCompare вместо оператора больше, чем , чтобы сравнить строки - этот метод является локальным.

function sortComparer(a,b){
    return a.title.localeCompare(b.title)
};
26
ответ дан Andris 23 August 2018 в 02:47
поделиться
  • 1
    Это будет работать только в том случае, если установлен языковой стандарт. Любой метод передачи культуры вместе со сравнимой стоимостью? – Andrej Kaurin 2 August 2011 в 10:14
  • 2
    Невозможно установить язык по сценарию, он определяется браузером или - в зависимости от браузера - унаследован от ОС. – Andris 2 August 2011 в 10:27
  • 3
    Я нашел полное решение здесь stackoverflow.com/questions/3630645/… – Andrej Kaurin 21 February 2012 в 10:47
  • 4
    Имейте в виду, что функция localeCompare намного тяжелее, чем просто сравнение строк с использованием операторов <, > и =. Даже начиная с набора результатов 500, происходит значительное замедление с использованием localeCompare. Как проиллюстрировано здесь, он медленнее в 400 раз: jsfiddle.net/L4715qey – Kafoso 1 February 2016 в 09:50

Для сортировки массива с настраиваемой настройкой выполните следующие действия:

  1. Создайте массив с пользовательским порядком алфавитов: var alphabets = ["A", "B", "C", "Č", "Ć", "D","Dž","Đ","E","F","G","H","I","J","K","L","Lj","M","N","Nj","O","P","R","S", "ÛŒ","T","U","V","Z","Ž"];
  2. Создайте список тестового массива : var testArrray = ["B2","D6","A1","Ć5","Č4","C3"];
  3. Создать имя функции сортировки:
    function OrderFunc(){
              testArrray.sort(function (a, b) {
                  return CharCompare(a, b, 0);
              });
          }
    
  4. создать функцию CharCompare (индекс: сортировать «AAAB» перед «AAAC»):
     function CharCompare(a, b, index) {
      if (index == a.length || index == b.length)
          return 0;
      //toUpperCase: isn't case sensitive
      var aChar = alphabets.indexOf(a.toUpperCase().charAt(index));
      var bChar = alphabets.indexOf(b.toUpperCase().charAt(index));
      if (aChar != bChar)
          return aChar - bChar
      else
          return CharCompare(a,b,index+1)
    
    }
  5. Вызовите OrderFunc для сортировки testArray (результат будет: A1, B2, C3, Č4, Ć5, D6).

Тест онлайн

Удача

0
ответ дан Iman Bahrampour 23 August 2018 в 02:47
поделиться
  • 1
    @TheChetan. это настраиваемая функция заказа, и вы можете управлять всеми алфавитами, которые вы собираетесь сортировать. например, русский алфавит имеет 33 символа, персидский имеет 32 символа и т. д. – Iman Bahrampour 9 October 2017 в 02:04

Вы пробовали функцию localeCompare() String:

function sortComparer(a, b) {
   return a.title.localeCompare(b.title);
}

Отказ от ответственности: я действительно не проверял, что localeCompare() делает с теми неанглийскими символами, а MDN тоже не говорит. (Он говорит, что toLocaleLowerCase() уважает текущую локаль, поэтому можно было бы надеяться, что localeCompare() будет одинаковым, но все же ...)

1
ответ дан nnnnnn 23 August 2018 в 02:47
поделиться
Другие вопросы по тегам:

Похожие вопросы: