【发布时间】:2018-07-12 16:15:26
【问题描述】:
假设我们有一个包含混合 name 值(数字、西里尔文、英文)的对象数组:
(如果代码不适合你,把undefined改成'ru',也会改变排序结构)
let ascending = true
var items = [
{name: 'c', value: ''},
{name: 'b', value: ''},
{name: 'a', value: ''},
{name: 'д', value: ''},
{name: 'в', value: ''},
{name: '41', value: ''},
{name: 'а', value: ''},
{name: 'б', value: ''},
{name: '0', value: ''},
{name: '31', value: ''},
{name: '4', value: ''},
{name: 'г', value: ''}
]
items.sort(function (a, b) {
// ascending order
if (ascending) {
return a.name.localeCompare(b.name, undefined, { numeric: true });
}
// descending order
else {
return b.name.localeCompare(a.name, undefined, { numeric: true });
}
})
console.log(items);
当前结果
我得到具有以下结构的升序排序数组:
- 数字(升序)
- 英语(升序)
- 非英语(升序)
ascending = true时的结果:
{name: "0", value: ""}
{name: "31", value: ""}
{name: "4", value: ""}
{name: "41", value: ""}
{name: "a", value: ""}
{name: "b", value: ""}
{name: "c", value: ""}
{name: "а", value: ""}
{name: "б", value: ""}
{name: "в", value: ""}
{name: "г", value: ""}
{name: "д", value: ""}
想要的结果
当ascending = false 并保留结构时,我需要它能够以降序对数组进行排序:
- 数字(降序)
- 英语(降序)
- 非英语(降序)
ascending = false时需要的结果:
{name: "41", value: ""}
{name: "31", value: ""}
{name: "4", value: ""}
{name: "0", value: ""}
{name: "c", value: ""}
{name: "b", value: ""}
{name: "a", value: ""}
{name: "д", value: ""}
{name: "г", value: ""}
{name: "в", value: ""}
{name: "б", value: ""}
{name: "а", value: ""}
问题
当我更改 ascending = false 并将 b.name 的位置更改为 a.name 时,它只会将整个数组倒置,而不是翻转其“类别”(数字、英语、西里尔字母)中的值。
我不确定如何正确执行此操作。我的意思是,反转数组会反转值,所以我应该在它翻转数组后重新构造数组“类别”吗?可能是这样的:
获取所有编号为
isNaN()的对象并将它们移到顶部然后在
[0]处获取仅包含a-z的项目并将它们移动到数字“类别”下方其他一切都停留在底部
【问题讨论】:
-
在
.sort()末尾追加.reverse() -
这意味着如果你想将项目分成单独的类别,你根本不能使用
localeCompare -
@Adelin 在数组上调用
reverse与反转排序没有什么不同(就像切换ascending已经做的那样) -
@Bergi 嗯,你知道任何其他方法来对这样一个混合数组进行排序,同时保留所需的结构吗?
-
@Un1 获取每一项的“类别”,然后先比较类别。
标签: javascript arrays sorting