如何只对这个字符串和整数的Javascript数组中的整数进行排序?

时间:2011-05-30 19:15:54

标签: javascript jquery arrays algorithm sorting

我需要使用普通的旧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 个答案:

答案 0 :(得分:1)

有一些可能的策略。

使用一个索引数组,以便你有一个间接层 - 创建一个数组[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++]; }
}

答案 1 :(得分:0)

嗯,这个问题很混乱,但经过一番思考后,在我看来,不可能按照我希望的方式对数组进行排序。

我提出的最佳解决方案是在项目添加到列表时对项目进行排序,在流程的每个步骤维护一个有效的数组,而不是尝试在事后进行排序。

随意发布其他答案。我很想知道人们想出了什么。这是一个有趣的问题。