Sort an array based on another array of integers

前端 未结 7 677
误落风尘
误落风尘 2020-11-27 21:59

Let\'s say I have an array: [0,3,4,2,5,1].

What I want to do is sort an array such as:

[\"one\", \"two\", \"three\", \"four\", \"five\",         


        
相关标签:
7条回答
  • 2020-11-27 22:42

    You can use first array as directory for sorting second one using map method:

    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"]
    
    0 讨论(0)
  • 2020-11-27 22:42
    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;
      }
    }
    
    0 讨论(0)
  • 2020-11-27 22:44
    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
    */
    

    //You can make the order an unindexed property of the array, // and call 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
    */
    
    0 讨论(0)
  • 2020-11-27 22:49
    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"]
    
    0 讨论(0)
  • 2020-11-27 22:51

    I was asked this on a phone interview. Then do it without creating another array, supposing the array is very large. I don't know if this is the answer since I wasn't able to do on the call (damn!), but here's what I came up with.

    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/

    0 讨论(0)
  • 2020-11-27 22:53

    You can do something like this:

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

    Note: this assumes the arrays you pass in are equivalent in size, you'd need to add some additional checks if this may not be the case.

    0 讨论(0)
提交回复
热议问题