【问题标题】:Sort array string which begins with a letter排序以字母开头的数组字符串
【发布时间】:2019-10-29 20:58:00
【问题描述】:

我如何对这个数组列表进行排序以确保所有以_ 开头的文件都排在第一位?

上下文:用于加载程序,我想确保首先加载带有_ 的所有文件。

列表是从扫描中随机生成的,所以我永远无法确定顺序。

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 });

对不起,如果我的英语很差。

【问题讨论】:

  • 请在排序后添加一个数组作为数据和想要的结果。什么是第一?

标签: javascript node.js sorting node-webkit


【解决方案1】:

基于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】:

    如果您想将任何以下划线开头的文件按顺序放在首位,请过滤并连接它。

    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)

    【讨论】:

      【解决方案3】:

      您可以简单地替换下划线进行排序并将此字符串放在目录顶部。

      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; }

      【讨论】:

        【解决方案4】:

        只需使用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);

        【讨论】:

          猜你喜欢
          • 2020-03-08
          • 1970-01-01
          • 1970-01-01
          • 2021-02-26
          • 1970-01-01
          • 1970-01-01
          • 2023-02-08
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多