【问题标题】:Sort an array based on another array of integers根据另一个整数数组对数组进行排序
【发布时间】:2011-05-02 02:39:00
【问题描述】:

假设我有一个数组:[0,3,4,2,5,1]

我想做的是对数组进行排序,例如:

["one", "two", "three", "four", "five", "six"]

这样顺序对应第一个数组。

这将是输出:

["one", "four", "five", "three", "six", "two"]

有没有简单的方法可以做到这一点?

【问题讨论】:

  • 您的问题令人困惑,因为它与排序无关。您保持数组的顺序相同,只需将数组的每个元素映射到另一个数组的元素。

标签: javascript arrays sorting integer


【解决方案1】:

你可以这样做:

function getSorted(arr, sortArr) {
  var result = [];
  for (var i = 0; i < arr.length; i++) {
    console.log(sortArr[i], arr[i]);
    result[i] = arr[sortArr[i]];
  }
  return result;
}
var arr = ["one", "two", "three", "four", "five", "six"];
var sortArr = [0, 3, 4, 2, 5, 1];
alert(getSorted(arr, sortArr));

注意:这假设您传入的数组大小相同,如果情况并非如此,您需要添加一些额外的检查。

【讨论】:

    【解决方案2】:
    orderedArray= function(arr,order){
        return  order.map(function(itm){return arr[itm]});
    }
    
    var sequence= [0, 3, 4, 2, 5, 1],arr=["one","two","three","four","five","six"]
    
    arr=new orderedArray(arr,sequence);
    
    /*  returned value: (Array)
    one,four,five,three,six,two
    */
    

    //你可以将订单设为数组的未索引属性, // 并调用 array.ordered()

    Array.prototype.ordered= function(order){
        var arr= this;
        order=order || this.order;
        return order.map(function(itm){
            return arr[itm];
        });
    }
    
    
    var arr= ["one","two","three","four","five","six"],
    sequence= [0, 3, 4, 2, 5, 1];
    
    arr.order=sequence;
    
    arr.ordered()
    
    /*  returned value: (Array)
    one,four,five,three,six,two
    */
    

    【讨论】:

      【解决方案3】:

      我在电话采访中被问到这个问题。然后在不创建另一个数组的情况下执行此操作,假设数组非常大。我不知道这是否是答案,因为我无法在通话中做(该死!),但这就是我想出的。

      var my_obj_array = ['a', 'b', 'c', 'd'];
      var my_indicies = [3, 1, 0, 2];
      // desired result ['d', 'b', 'a', 'c']
      
      var temp = {};
      for (var i = 0; i < my_indicies.length; i++) {
          temp[i] = my_obj_array[i];  // preserve
          var j = my_indicies[i];
          if (j in temp) {
              my_obj_array[i] = temp[j];
              delete temp[j];
          } else {
              my_obj_array[i] = my_obj_array[j];
          }
      }
      

      http://jsfiddle.net/innerb/RENjW/

      【讨论】:

        【解决方案4】:

        不知道如何获得第一个数组,但您可以使用对象数组而不是 [0,3,4,2,5,1]

        var arr = [
          {n:0, s:'one'},
          {n:3, s:'four'},
          {n:4, s:'five'},
          {n:2, s:'three'},
          {n:5, s:'six'},
          {n:1, s:'two'}
        ]
        

        并避免处理它。

        【讨论】:

          【解决方案5】:

          您可以使用第一个数组作为目录,使用 map 方法对第二个数组进行排序:

          const firstArray = [0, 3, 4, 2, 5, 1];
          const secondArray = ['one', 'two', 'three', 'four', 'five', 'six'];
          
          const result = firstArray.map((item) => {
           return secondArray[item];
          });
          // result = ["one", "four", "five", "three", "six", "two"]
          

          【讨论】:

            【解决方案6】:
            let inds = [0,3,4,2,5,1];
            let x = ["one", "two", "three", "four", "five", "six"];
            let x2 = [];  //Output
            inds.forEach(ind => x2.push(x[ind]));
            x2
            //(6) ["one", "four", "five", "three", "six", "two"]
            

            【讨论】:

              【解决方案7】:
              class test1
              {
                public static String[] sort(int[] array,String[] str)
                {
                  String[] out=new String[str.length];
                  for(int i=0;i<str.length;i++)
                  {
                    out[i]=str[array[i]];
                  }
                  return out;
                }
              }
              

              【讨论】:

              • 这是 Java,但问题要求使用 JavaScript。如果你制作这个伪代码可能会有所帮助。
              猜你喜欢
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2013-11-10
              • 2013-10-22
              相关资源
              最近更新 更多