Сортировка строк массива Javascript на основе массива int - PullRequest
3 голосов
/ 10 мая 2011

В javascript у меня есть массив:

letterArray ['a', 'e', 'i', 'o', 'u']

, соответствующий этому массиву, у меня есть другой массив:

valueArray [12, 22, 7, 7, 3]

Я хочу отсортировать valueArray в

[22, 12, 7, 7, 3]

но letterArray также нужно отсортировать таким же образом:

['e', 'a', 'i', 'o', 'u']

Как бы я мог это сделать?

Ответы [ 6 ]

2 голосов
/ 10 мая 2011

Вы можете сделать это, используя метод архивирования.Я бы использовал _.zip.

// [["a", 12], ["e", 22], ...]
var arr = _.zip(letterArray, valueArray); // zip them up.
// sort
// [["u", 3], ["i", 7] OR ["o", 7], ...]
var sortedArr = _.sortBy(arr, function(val) {
    // sort by the value array.
    return val[1];
});
// pluck the letter array back out
// ["u", "i" OR "o", ...]
var newLetterArray = _.pluck(sortedArr, "0");
// pluck the value array back out
// [3, 7, 7, ...]
var newValueArray = _.pluck(sortedArr, "1");

Боюсь, ваш пример сложен из-за дублирования номеров, что означает, что вы не можете гарантировать порядок сортировки.Это зависит от браузера, на первом месте стоит «i» или «o».

2 голосов
/ 10 мая 2011

Метод 1: Сожмите ваши два массива в заархивированную вещь, например [[12,'a'], [22, 'e'], [7, 'i'], [7, 'o'], [3, 'u']], а затем отсортируйте полученный массив.Тогда просто прочитайте буквы.Преимущество этого заключается в том, что вы можете использовать встроенный алгоритм сортировки, и вам просто нужно написать средство доступа.

Метод 2: Сверните свой собственный алгоритм сортировки и каждый раз, когда вы выполняете операцию, которая изменяет intмассив, выполните соответствующую операцию над массивом букв.

Я рекомендую метод 1.

1 голос
/ 10 мая 2011
// myArray.zip interleaves N arrays into one array of all pieces
// e.g. [1,2,3].zip([4,5,6],[7,8,9]) -> [ [1,4,7], [2,5,8], [3,6,9] ]
(function(o){
  var zip = function(){
    var argLen = arguments.length;
    var result = new Array(this.length);
    for (var i=this.length-1;i>=0;--i){
    var a = result[i] = [this[i]];
    for (var j=0;j<argLen;++j) a[j+1] = arguments[j][i];
    }
    return result;
  }
  if (Object.defineProperty) Object.defineProperty(o,"zip",{value:zip});
  else o.zip = zip;
})(Array.prototype);

var letters = ['a', 'e', 'i', 'o', 'u'];
var values  = [12, 22, 7, 7, 3];
var valuesAndLetters = values.zip(letters);
// [[12,"a"],[22,"e"],[7,"i"],[7,"o"],[3,"u"]]

var sorted = valuesAndLetters.sort(function(a,b){
  // Sort in descending order, first by value, then by letter
  return a[0]<b[0]?1:a[0]>b[0]?-1:a[1]<b[1]?1:a[1]>b[1]?-1:0;
});
// [[22,"e"],[12,"a"],[7,"o"],[7,"i"],[3,"u"]]

Редактировать : Если у вас нет (или вы хотите положиться) defineProperty и не хотите расширять Array.prototype в качестве запасного варианта, то вот версияпочтовый индекс, который не касается чьего-либо прототипа:

// Interleaves N arrays into one array of all pieces
// e.g. Array.zip([1,2,3],[4,5,6],[7,8,9]) -> [ [1,4,7], [2,5,8], [3,6,9] ]
Array.zip = function zip(a0,a1,etc,aN){
  var argLen = arguments.length;
  var result = new Array(a0.length);
  for (var i=a0.length-1;i>=0;--i){
    var a = result[i] = [a0[i]];
    for (var j=1;j<argLen;++j) a[j] = arguments[j][i];
  }
  return result;
};

var letters = ['a', 'e', 'i', 'o', 'u'];
var values  = [12, 22, 7, 7, 3];
var valuesAndLetters = Array.zip(values,letters);
// [[12,"a"],[22,"e"],[7,"i"],[7,"o"],[3,"u"]]

var sorted = valuesAndLetters.sort(function(a,b){
  // Sort in descending order, first by value, then by letter
  return a[0]<b[0]?1:a[0]>b[0]?-1:a[1]<b[1]?1:a[1]>b[1]?-1:0;
});
// [[22,"e"],[12,"a"],[7,"o"],[7,"i"],[3,"u"]]
0 голосов
/ 10 мая 2011

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

letters_and_values = [{letter: 'a', value: 12},
                      {letter: 'e', value: 22},
                      {letter: 'i', value: 7},
                      {letter: 'o', value: 7},
                      {letter: 'u', value: 3}];

function valueCompare(obj1, obj2) {
    if (obj1.value < obj2.value) {
        return 1;
    }
    else if (obj1.value > obj2.value) {
        return -1;
    }
    else { 
        return 0;
    }
}

letters_and_values.sort(valueCompare);

// => [Object { letter="e", value=22}, 
//     Object { letter="a", value=12},
//     Object { letter="i", value=7}, 
//     Object { letter="o", value=7}, 
//     Object { letter="u", value=3}]
0 голосов
/ 10 мая 2011

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

var letterArray = ['a', 'e', 'i', 'o', 'u'];
var valueArray = [12, 22, 7, 7, 3];
var indexArray = [0, 1, 2, 3, 4]; // normally you would compute this dynamically
indexArray.sort(function(a, b) { return valueArray[a] - valueArray[b]; });

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

0 голосов
/ 10 мая 2011
function odd_way_to_sort(intArr, charArr){
    var min = intArr[0]
    for(index in intArr){
        //some sort of sorting
        // where you save the indexes and then match them to corresponding char Arr indexes
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...