我有一个javascript数组,如下所示:
var data = ["size64_tolPercent0.01_best", "size256_tolPercent0.01_best", "size256_tolPercent0_worst", "sizemax_tolPercent0_worst", "size1518_tolPercent0_worst", "size64_tolPercent0.01_worst", "size512_tolPercent0.01_worst", "size1518_tolPercent0.01_worst", "size256_tolPercent0_best"] etc
我想对这个数组进行排序:
因此,我们最终得到一个如下所示的结果数组:
["size64_tolPercent0_best", "size256_tolPercent0_best", "size512_tolPercent0_best", "size1518_tolPercent0_best", "sizemax_tolPercent0_best", "size64_tolPercent0.01_best", "size512_tolPercent0.01_best", "size1518_tolPercent0.01_best", "size64_tolPercent0_worst", "size256_tolPercent0_worst", "size512_tolPercent0_worst", "size1518_tolPercent0_worst", "sizemax_tolPercent0_worst"] etc
我可以使用其中一种方法对字符串进行排序,但不是全部。
这是我到目前为止所做的尝试,我做错了我确定,只需要一些正确方向的帮助。现在为1和3做:
var someLargeValue = 10000000;
data.sort(function(x,y){
var xp = x.substr(getPosition(x, '_', 2) + 1, x.split("_").pop().length);
var yp = y.substr(getPosition(y, '_', 2) + 1, y.split("_").pop().length);
return xp == yp ? 0 : xp < yp ? -1 : 1;
});
data.sort(function(x,y){
var xp = x.substr(4, getPosition(x, '_', 1) - 4);
var yp = y.substr(4, getPosition(y, '_', 1) - 4);
if(xp === "max") {
xp = someLargeValue;
}
if(yp === "max") {
yp = someLargeValue;
}
xp = parseInt(xp);
yp = parseInt(yp);
return xp == yp ? 0 : xp < yp ? -1 : 1;
});
function getPosition(str, m, i) {
return str.split(m, i).join(m).length;
}
但是我担心我正在尝试的代码是按顺序进行排序。所以我认为第二种自定义排序方法被第二种方式覆盖了吗?
任何帮助都非常感激。
答案 0 :(得分:2)
我首先要拆分字符串,以便最大限度地减少比较函数的工作量,并使其更具可读性。然后,我会在数组排序后重新创建字符串。使用地图更聪明:https://stackoverflow.com/a/32379540/1636522 :-D
var data = ["size64_tolPercent0_best", "size256_tolPercent0_best", "size512_tolPercent0_best", "size1518_tolPercent0_best", "sizemax_tolPercent0_best", "size64_tolPercent0.01_best", "size512_tolPercent0.01_best", "size1518_tolPercent0.01_best", "size64_tolPercent0_worst", "size256_tolPercent0_worst", "size512_tolPercent0_worst", "size1518_tolPercent0_worst", "sizemax_tolPercent0_worst"];
// split the strings
var re = /max|\d+(?:\.\d+)?(?=_)|[^_]+$/g;
data = data.map(function (x) {
x = x.match(re); // example: ["64", "0.01", "best"]
if (x[0] !== 'max') x[0] = parseInt(x[0], 10);
x[1] = parseFloat(x[1]);
return x;
});
// sort the array
data.sort(function cmp (a, b) {
// 1. "best" and "worst"
if (a[2] > b[2]) return 1;
if (a[2] < b[2]) return -1;
// 2. percent
if (a[1] > b[1]) return 1;
if (a[1] < b[1]) return -1;
// 3. size
if (a[0] === 'max') return 1;
if (b[0] === 'max') return -1;
if (a[0] > b[0]) return 1;
if (a[0] < b[0]) return -1;
// 4. no differences
return 0;
});
// recreate the strings
data = data.map(function (x) {
x[0] = 'size' + x[0];
x[1] = 'tolPercent' + x[1];
return x.join('_');
});
// print the result
data.forEach(function (x) {
document.write(x + '<br />');
});
&#13;
* {font-family:Courier}
&#13;
答案 1 :(得分:2)
此解决方案以MDN的Sorting with map为特色。
首先使用拆分项构建一个映射数组以进行排序。然后按自定义顺序对其进行排序。
VolleyResponseListener
共:
public interface VolleyResponseListener {
void onError(String message);
void onResponse(Object response);
}
答案 2 :(得分:0)
Array类有一个排序函数:https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/sort
利用compare
参数:
data.sort(function(a, b) {
// Follow the docs as per how a relates to b, returning -1 (a < b),0 (equal) or 1 (a > b)
});
根据函数的要求提取并比较子字符串。
<强>更新强>
阅读完您添加的代码后,不要再调用sort()两次,只需将所有比较合并到相同的排序比较中。停在第一个不等式(aValue !== bValue
)并返回该比较。