Сортировка массива строк на основе символа в строке

#javascript #arrays #string

#javascript #массивы #строка

Вопрос:

Я пытаюсь отсортировать массив строк на основе символа внутри каждой из этих строк. Пока у меня есть это

 function doMath(s) {

  let arr = s.split(' ');
  let letterArr = [];
  let sortedArr = [];
  let n = 0;
  for (var i = 0; i < arr.length; i  ) {

    n = arr[i].indexOf(arr[i].match(/[a-z]/i));
    letterArr.push(arr[i][n]);

  }
  letterArr.sort();

  console.log(letterArr);

  for (i = 0; i < arr.length; i  ) {
    for (var j = 0; j <= arr[i].length; j  ) {

      if (arr[i].indexOf(letterArr[j]) > -1) {
        sortedArr.unshift(arr[i]);
      }

    }
  }
  console.log(sortedArr);
}

doMath("24z6 1x23 y369 89a 900b");  

Проблема проявляется, когда я регистрирую этот массив. Если я использую sortedArr.push(arr[i]); ,
то вывод:

 ["24z6", "1x23", "y369", "89a", "900b"]
  

Однако, когда я использую sortedArr.unshift(arr[i]); , я получаю вывод:

 ["900b", "89a", "y369", "1x23", "24z6"]
  

Я не уверен, почему b перед a .

Я просто хочу, чтобы это было по алфавиту для сортировки. Я попробовал push() , и это правильно, но в обратном направлении (z-a). Когда я пытаюсь unshift() , все правильно, за исключением b a того, что переключаются и .

Комментарии:

1. Каково условие сортировки массива? Вы просто хотите изменить ввод в виде массива или существует определенный порядок?

2. Я просто хочу, чтобы это было по алфавиту для сортировки. я попробовал нажать, и это правильно, но в обратном направлении (z-a) когда я пытаюсь отменить сдвиг, это правильно, за исключением того, что b и a переключаются

3. Итак, вы хотите: ["89a", "900b", "1x23", "y369", "24z6"] правильно? Я предполагаю, что вы не хотите x после y .

4. Ваши циклы вывернуты наизнанку: сначала вы должны перебирать буквы ( j ), а затем находить соответствующий элемент массива ( i )

5. @georg это имеет смысл! Спасибо

Ответ №1:

 function doMath(s) {
   return s.split(' ').sort(function (a,b) {
      return a.match(/[a-z]/i)[0].localeCompare(b.match(/[a-z]/i)[0])})
}

console.log(doMath("24z6 1x23 y369 89a 900b"));  

Комментарии:

1. Было бы неплохо предоставить некоторые пояснения к вашему коду. Кроме того, было бы лучше использовать ту же организацию, что и в операционной системе (т. Е. doMath() Функцию, Которая возвращает результаты). Другим улучшением было бы поместить все это во фрагмент с a console.log() после него, чтобы люди могли запускать его на странице a, чтобы убедиться, что вы генерируете правильный вывод.

2. Я должен признать, что не пробовал фрагменты кода.. Был участником всего пару дней,.. Я посмотрю, смогу ли я сделать это таким образом.

3. О,. Мне это нравится .. я тоже делал все эти отступы в 4 пробела . .:)

4. Фрагменты помогают с чем-то вроде этого (JavaScript / HTML / CSS). При таком вопросе / ответе, как этот, использование фрагмента приведет к большему количеству голосов (и, следовательно, к повышению репутации), поскольку люди тривиально проверяют ответ. Отступ в 4 пробела можно выполнять блоками, используя кнопку code между кнопками quote и picture на панели инструментов над рамкой редактирования.

5. @Keith Вау, это здорово. Намного проще, чем мой код. Спасибо. я многому могу научиться из этого