Сортировать строку массива, которая начинается с буквы - PullRequest
2 голосов
/ 15 июня 2019

Как мне отсортировать этот список массивов, чтобы убедиться, что все файлы, начинающиеся с _, будут первыми?

Контекст : предназначен для загрузчика, и я хочу, чтобы сначала были загружены все файлы с _.

Список генерируется случайным образом из сканирования, поэтому я никогда не могу быть уверен в заказе.

0:"js\game\global\app.js"
1:"js\game\global\camera.js"
2:"js\game\global\displayGroups.js"
3:"js\game\global\dataBase.js"
4:"js\game\global\mouse.js"
5:"js\game\global\loaders.js"
6:"js\game\global\stage.js"
7:"js\game\global\polyfill.js"
8:"js\game\scenes\scene_boot.js"
9:"js\game\scenes\scene_IntroVideo.js"
10:"js\game\scenes\scene_loader.js"
11:"js\game\scenes\scene_Map1.js"
12:"js\game\scenes\_scene_base.js" //need to be alway first
13:"js\game\scenes\scene_Title.js"

Таким образом, в этом примере после сортировки файл _scene_base должен быть первым.

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

 files.sort((a,b) => {return a.indexOf("\_")>-1?-files.indexOf(a):0 });

извините, если я плохо говорю по-английски.

Ответы [ 4 ]

3 голосов
/ 16 июня 2019

Другое решение, основанное на indexOf и только первой позиции подчеркивания.

const arr = [
  'js\\game\\global\\app.js',
  'js\\game\\global\\camera.js',
  'js\\game\\global\\displayGroups.js',
  'js\\game\\global\\dataBase.js',
  'js\\game\\global\\mouse.js',
  'js\\game\\global\\loaders.js',
  'js\\game\\global\\stage.js',
  'js\\game\\global\\polyfill.js',
  'js\\game\\scenes\\scene_boot.js',
  'js\\game\\scenes\\scene_IntroVideo.js',
  'js\\game\\scenes\\scene_loader.js',
  'js\\game\\scenes\\scene_Map1.js',
  'js\\game\\scenes\\scene_Title.js',
  'js\\game\\scenes\\_scene_base.js',
  'js\\game\\scenes\\scene_Loader.js',
  'js\\game\\scenes\\_scenebase.js',
  'js\\game\\scenes\\sceneTit_le.js',
  'js\\game\\scenes\\scene_introVide_o.js',
  'js\\game\\scenes\\sceneIntroVi_deo.js',
];

arr.sort((a, b) => {
   const ai = a.indexOf('_');
   const bi = b.indexOf('_');
   return (ai > -1 && bi > -1 && (ai - bi)) || -1;
});

console.log(arr)
2 голосов
/ 15 июня 2019

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

var array = ["js\\game\\global\\app.js", "js\\game\\global\\camera.js", "js\\game\\global\\displayGroups.js", "js\\game\\global\\dataBase.js", "js\\game\\global\\mouse.js", "js\\game\\global\\loaders.js", "js\\game\\global\\stage.js", "js\\game\\global\\polyfill.js", "js\\game\\scenes\\scene_boot.js", "js\\game\\scenes\\scene_IntroVideo.js", "js\\game\\scenes\\scene_loader.js", "js\\game\\scenes\\scene_Map1.js", "js\\game\\scenes\\_scene_base.js", "js\\game\\scenes\\scene_Title.js"]

array.sort((a, b) => a.replace(/_/g, ' ').localeCompare(b.replace(/_/g, ' ')));

console.log(array);
.as-console-wrapper { max-height: 100% !important; top: 0; }
2 голосов
/ 15 июня 2019

Просто используйте Array.sort(), передавая свой собственный компаратор, и используйте String.startWith(), чтобы проверить, начинается ли имя файла с "_": Попробуйте следующее:

let arr =['js\\game\\global\\app.js', 'js\\game\\global\\camera.js', 'js\\game\\global\\displayGroups.js', 'js\\game\\global\\dataBase.js', 'js\\game\\global\\mouse.js', 'js\\game\\global\\loaders.js', 'js\\game\\global\\stage.js', 'js\\game\\global\\polyfill.js', 'js\\game\\scenes\\scene_boot.js', 'js\\game\\scenes\\scene_IntroVideo.js', 'js\\game\\scenes\\scene_loader.js', 'js\\game\\scenes\\scene_Map1.js', 'js\\game\\scenes\\_scene_base.js', 'js\\game\\scenes\\scene_Title.js' ];

arr.sort((a,b)=>{
  let str1Array = a.split("\\");
  let str2Array = b.split("\\");
  return str2Array[str2Array.length-1].startsWith("_") -str1Array[str1Array.length-1].startsWith("_") 
});

console.log(arr);
2 голосов
/ 15 июня 2019

Если вы хотите поместить любой файл, который начинается с подчеркивания , по порядку, отфильтруйте и объедините его.

const arr = ['js\\game\\global\\app.js',
  'js\\game\\global\\camera.js',
  'js\\game\\global\\displayGroups.js',
  'js\\game\\global\\dataBase.js',
  'js\\game\\global\\mouse.js',
  'js\\game\\global\\loaders.js',
  'js\\game\\global\\stage.js',
  'js\\game\\global\\polyfill.js',
  'js\\game\\scenes\\scene_boot.js',
  'js\\game\\scenes\\scene_IntroVideo.js',
  'js\\game\\scenes\\scene_loader.js',
  'js\\game\\scenes\\scene_Map1.js',
  'js\\game\\scenes\\_scene_base.js',
  'js\\game\\scenes\\scene_Title.js'
]

const _files = arr.filter(e => e.indexOf('\\_') !== -1).sort()
const files = arr.filter(e => e.indexOf('\\_') === -1).sort()

const arr2 = _files.concat(files)

console.log(arr2)
...