jQuery 按两个值排序无效,只能按第一个值排序
jQuery sorting by two values is not working and only sorts by first value
我有一个看起来像这样的数组
['NAME', 5, '2. Defender', 'FALSE', 'TRUE', 'FALSE', 'undefined']
['NAME', 5, '4. Forward', 'TRUE', 'TRUE', 'FALSE', 'undefined']
['NAME', 5, '2. Defender', 'FALSE', 'TRUE', 'FALSE', 'undefined']
['NAME', 4, '4. Forward', 'FALSE', 'TRUE', 'FALSE', 'undefined']
['NAME', 3, '5. Midfielder', 'FALSE', 'FALSE', 'FALSE', 'undefined']
我正在参考 this page 如何排序,这就是我所拥有的:
array.sort(
function(a, b) {
if (a[1] === b[1]) {
// Price is only important when cities are the same
return b[2] - a[2];
}
return a[1] < b[1] ? 1 : -1;
});
它仅按 [1]
值排序,不会按辅助 [2]
值排序。我以为我的数组可能有问题,但是当我先切换为按 [2]
排序时,它会按该值排序。虽然目标是首先按 [1]
排序,然后再按 [2]
.
排序
第三个数组元素[2]是一个字符串,不能通过减法进行比较。使用 .localeCompare
代替
array.sort((a, b) => a[1] !== b[1] ? a[1] - b[1] : a[2].localeCompare(b[2]))
您正在尝试对两个字符串执行数学运算('2. Defender'
与 '4. Forward'
)。
您可以 嵌套 与 a[1]
与 b[1]
相同的比较,如下所示:
let array = [
['ONE1', 5, '2. Defender', 'FALSE', 'TRUE', 'FALSE', 'undefined'],
['TWO2', 5, '4. Forward', 'TRUE', 'TRUE', 'FALSE', 'undefined'],
['THR3', 5, '2. Defender', 'TRUE', 'TRUE', 'FALSE', 'undefined'],
['FOR4', 4, '4. Forward', 'FALSE', 'TRUE', 'FALSE', 'undefined'],
['FIV5', 3, '5. Midfielder', 'FALSE', 'FALSE', 'FALSE', 'undefined']
]
array.sort(function(a, b) {
if (a[1] === b[1]) {
// Price is only important when cities are the same
if (a[2] === b[2]) {
//return 0;
/*
or nest another comparison here and as many times as needed
within each child `a[n]===b[n]` block
*/
if (a[3] === b[3]) {
return 0; // or compare yet another col
}
return a[3] < b[3] ? 1 : -1;
}
return a[2] < b[2] ? 1 : -1;
}
return a[1] < b[1] ? 1 : -1;
})
array.forEach((p) => {
console.log(p[0])
})
否则,您需要获取这些字符串的整数值才能进行数学计算。您可以使用 parseInt()
或根据您的逻辑为每个排序列分配显式值,如下所示:
let array = [
['ONE1', 5, '2. Defender', 'FALSE', 'TRUE', 'FALSE', 'undefined'],
['TWO2', 5, '4. Forward', 'TRUE', 'TRUE', 'FALSE', 'undefined'],
['THR3', 5, '2. Defender', 'TRUE', 'TRUE', 'FALSE', 'undefined'],
['FOR4', 4, '4. Forward', 'FALSE', 'TRUE', 'FALSE', 'undefined'],
['FIV5', 3, '5. Midfielder', 'FALSE', 'FALSE', 'FALSE', 'undefined']
]
array.sort(function(a, b) {
if (a[1] === b[1]) {
// Price is only important when cities are the same
let c = parseInt(a[2]);
let d = parseInt(b[2]);
if (c === d) {
// the string 'TRUE' before 'FALSE', '' or null
let e = (a[3] === 'TRUE') ? 1 : 0;
let f = (b[3] === 'TRUE') ? 1 : 0;
return f - e;
}
return d - c;
}
return a[1] < b[1] ? 1 : -1;
})
array.forEach((p) => {
console.log(...p)
})
我有一个看起来像这样的数组
['NAME', 5, '2. Defender', 'FALSE', 'TRUE', 'FALSE', 'undefined']
['NAME', 5, '4. Forward', 'TRUE', 'TRUE', 'FALSE', 'undefined']
['NAME', 5, '2. Defender', 'FALSE', 'TRUE', 'FALSE', 'undefined']
['NAME', 4, '4. Forward', 'FALSE', 'TRUE', 'FALSE', 'undefined']
['NAME', 3, '5. Midfielder', 'FALSE', 'FALSE', 'FALSE', 'undefined']
我正在参考 this page 如何排序,这就是我所拥有的:
array.sort(
function(a, b) {
if (a[1] === b[1]) {
// Price is only important when cities are the same
return b[2] - a[2];
}
return a[1] < b[1] ? 1 : -1;
});
它仅按 [1]
值排序,不会按辅助 [2]
值排序。我以为我的数组可能有问题,但是当我先切换为按 [2]
排序时,它会按该值排序。虽然目标是首先按 [1]
排序,然后再按 [2]
.
第三个数组元素[2]是一个字符串,不能通过减法进行比较。使用 .localeCompare
代替
array.sort((a, b) => a[1] !== b[1] ? a[1] - b[1] : a[2].localeCompare(b[2]))
您正在尝试对两个字符串执行数学运算('2. Defender'
与 '4. Forward'
)。
您可以 嵌套 与 a[1]
与 b[1]
相同的比较,如下所示:
let array = [
['ONE1', 5, '2. Defender', 'FALSE', 'TRUE', 'FALSE', 'undefined'],
['TWO2', 5, '4. Forward', 'TRUE', 'TRUE', 'FALSE', 'undefined'],
['THR3', 5, '2. Defender', 'TRUE', 'TRUE', 'FALSE', 'undefined'],
['FOR4', 4, '4. Forward', 'FALSE', 'TRUE', 'FALSE', 'undefined'],
['FIV5', 3, '5. Midfielder', 'FALSE', 'FALSE', 'FALSE', 'undefined']
]
array.sort(function(a, b) {
if (a[1] === b[1]) {
// Price is only important when cities are the same
if (a[2] === b[2]) {
//return 0;
/*
or nest another comparison here and as many times as needed
within each child `a[n]===b[n]` block
*/
if (a[3] === b[3]) {
return 0; // or compare yet another col
}
return a[3] < b[3] ? 1 : -1;
}
return a[2] < b[2] ? 1 : -1;
}
return a[1] < b[1] ? 1 : -1;
})
array.forEach((p) => {
console.log(p[0])
})
否则,您需要获取这些字符串的整数值才能进行数学计算。您可以使用 parseInt()
或根据您的逻辑为每个排序列分配显式值,如下所示:
let array = [
['ONE1', 5, '2. Defender', 'FALSE', 'TRUE', 'FALSE', 'undefined'],
['TWO2', 5, '4. Forward', 'TRUE', 'TRUE', 'FALSE', 'undefined'],
['THR3', 5, '2. Defender', 'TRUE', 'TRUE', 'FALSE', 'undefined'],
['FOR4', 4, '4. Forward', 'FALSE', 'TRUE', 'FALSE', 'undefined'],
['FIV5', 3, '5. Midfielder', 'FALSE', 'FALSE', 'FALSE', 'undefined']
]
array.sort(function(a, b) {
if (a[1] === b[1]) {
// Price is only important when cities are the same
let c = parseInt(a[2]);
let d = parseInt(b[2]);
if (c === d) {
// the string 'TRUE' before 'FALSE', '' or null
let e = (a[3] === 'TRUE') ? 1 : 0;
let f = (b[3] === 'TRUE') ? 1 : 0;
return f - e;
}
return d - c;
}
return a[1] < b[1] ? 1 : -1;
})
array.forEach((p) => {
console.log(...p)
})