我需要使用普通的旧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);
答案 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)
嗯,这个问题很混乱,但经过一番思考后,在我看来,不可能按照我希望的方式对数组进行排序。
我提出的最佳解决方案是在项目添加到列表时对项目进行排序,在流程的每个步骤维护一个有效的数组,而不是尝试在事后进行排序。
随意发布其他答案。我很想知道人们想出了什么。这是一个有趣的问题。