Как я могу отсортировать только целые числа в этом массиве Javascript строк и целых чисел? - PullRequest
0 голосов
/ 30 мая 2011

Мне нужно отсортировать массив этого формата, используя старый добрый Javascript или jQuery:

var array = [6, 3, 18, 'four', 8, 'five', 6, 'nineteen', 'eight', 'two'];

// Write some javascript or jQuery code below to make sure that
// the integers in the array are correctly ordered from lowest
// to highest.

// Strings should be ignored, remaining in the same order.

// For example, the result for the array above should be:
// [3, 'four', 'five', 6, 6, 8, 18, 'nineteen', 'eight', 'two']

console.log(array);

Ответы [ 2 ]

1 голос
/ 30 мая 2011

Существует несколько возможных стратегий.

Используйте массив индексов, чтобы у вас был уровень косвенности - создайте массив [0, 1, 2, 3, 4, 5, ...] и отсортировать его с помощью специального компаратора, который разыменовывает 3 в массив [3].Компонент разыменования может не подчиняться транзитивному свойству, хотя вы можете столкнуться с неопределенным поведением.O (n) требуется дополнительная память.

var array = [6, 3, 18, 'four', 8, 'five', 6, 'nineteen', 'eight', 'two'];

// Create an array of indices.
var indices = [];
for (var i = array.length; --i >= 0;) { indices[i] = i; }
// indices is [0, 1, 2, 3, 4, 5, 6, 7, 8, 9];

// Sort the indices, comparing by number of corresponding element iff
// corresponding elements are both numbers.
indices.sort(function (i, j) {
  var a = array[i], b = array[j];  // dereference
  if (a === (a | 0) && b === (b | 0)) {
    return a === b ? 0 : a < b ? -1 : 1;
  } else {
    return i - j;
  }
});

var newArray = [];
for (var i = array.length; --i >= 0;) { newArray[i] = array[indices[i]; }

array = newArray;

Другим классом решений является извлечение чисел, сортировка и последующая замена, которая требует O (n) дополнительной памяти в худшем случае.

var array = [6, 3, 18, 'four', 8, 'five', 6, 'nineteen', 'eight', 'two'];

var integers = array.filter(function (x) { return x === (x | 0); });
integers.sort();

for (var i = 0, k = 0; k < integers.length; ++i) {
  if (array[i] === (array[i] | 0)) { array[i] = integers[k++]; }
}
0 голосов
/ 31 мая 2011

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

Лучшее решение, которое я придумал, - сортировать элементы по мере их добавления в список, поддерживая действительный массив на каждом этапе процесса, вместо того, чтобы пытаться сортировать по факту.

Не стесняйтесь размещать другие ответы. Я хотел бы увидеть, что люди придумали. Это интересная проблема.

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