【问题标题】:Sorting or Arranging an Array with a standard array values使用标准数组值对数组进行排序或排列
【发布时间】:2015-08-27 13:28:11
【问题描述】:

我想对每次从数据库中获取的动态 javascript 数组进行排序。条件是我想根据存储在标准预定义数组中的特定顺序的值对其进行排序。

假设我的动态数组是这样的:

var dbArray = ['Apple','Banana','Mango','Apple','Mango','Mango','Apple'];

并假设我必须对上述数组进行排序的标准数组是这样的

var stdArray = ['Mango','Apple','Banana','Grapes'];

所以在对 dbArray 进行排序后,我的结果数组应该如下所示:

var resultArray = ['Mango','Mango','Mango','Apple','Apple','Apple','Banana'];

因为它被排序保持 stdArray 作为排序标准,它可以是任何顺序而不管字母顺序或任何其他可用的标准排序顺序,纯自定义排序。

【问题讨论】:

    标签: javascript arrays algorithm sorting


    【解决方案1】:

    这个解决方案很慢,但应该可以工作

    dbArray.sort(function(a,b) { 
        return stdArray.indexOf(a) - stdArray.indexOf(b);
    });
    

    如果您担心性能,可以使用映射来跟踪每个项目的索引,以避免每次比较都扫描数组。

    var indexMap ={};
    stdArray.forEach(function(str) {
        indexMap[str]=stdArray.indexOf(str);
    });
    
    dbArray.sort(function(a,b) { 
        return indexMap[a] - indexMap[b];
    });
    

    【讨论】:

    • @Davidbarker 不再。
    • 很好,我喜欢第二个例子!
    • @JuanMendes :是的,很好,解决了问题。谢谢:)
    【解决方案2】:

    您可以使用典型的排序,并根据a 的索引与参考数组中b 的索引进行比较。

    dbArray.sort(function (a, b) {
        return stdArray.indexOf(a) - stdArray.indexOf(b);
    });
    

    【讨论】:

      【解决方案3】:
      var dbArray = ['Apple','Banana','Mango','Apple','Mango','Mango','Apple'];
      var stdArray = ['Mango', 'Apple', 'Banana', 'Grapes'];
      var sortArray = [];
      stdArray.forEach(function (a) {
          while (dbArray.indexOf(a) !== -1) {
              sortArray.push(dbArray.splice(dbArray.indexOf(a), 1));
          }
      });
      sortArray.push(dbArray);
      console.log(sortArray); // Mango,Mango,Mango,Apple,Apple,Apple,Banana,
      

      【讨论】:

        【解决方案4】:
        var dbArray = ['Apple','Banana','Mango','Apple','Mango','Mango','Apple'];
        
        var stdArray = ['Mango','Apple','Banana','Grapes'];
        
        var resultArray = new Array();
        

        .

        var i,l, k=0,isort=0;
        
        for(i=0; i<stdArray.length; i++)
        {  
          k = dbArray.filter(function(x){return x==stdArray[i]}).length;
          for(l=0; l<k; l++)
         {
            resultArray[isort + l] = stdArray[i];    
         }
        
         isort += k;
        
        }
        

        //检查:

        var resultString = "";
         for(i=0; i<resultArray.length; i++)
         {
         resultString += resultArray[i];
         resultString += " ";  
        
         }
        
         alert(resultString);
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2011-10-27
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2020-04-13
          • 1970-01-01
          相关资源
          最近更新 更多