Un1*_*Un1 6 javascript arrays sorting
假设我们有一组具有混合name值的对象(nums,cyrillic,english):
(如果代码不适合你,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);Run Code Online (Sandbox Code Playgroud)
我按升序获得排序数组,结构如下:
结果时间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: ""}
Run Code Online (Sandbox Code Playgroud)
我需要它能够在降序时对数组进行排序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: ""}
Run Code Online (Sandbox Code Playgroud)
当我改变ascending = false并改变它的位置时b.name,a.name只需翻转整个阵列而不是翻转它们的"类别"(nums,english,cyrillic)中的值.
我不确定如何正确地做到这一点.我的意思是,反转数组会反转这些值,所以我应该在翻转数组后重组数组"类别"吗?这样的事情可能是:
获取带有数字的所有对象isNaN()并将它们移到顶部
然后得到只包含a-z在的项目[0]并将它们移到数字"类别"下面
其他一切都停留在底部
之后,我只需将排序的“类别”移动到所需的位置即可重组翻转的数组:
\n\nlet ascending = false\r\n\r\nvar items = [\r\n {name: \'c\', value: \'\'}, \r\n {name: \'b\', value: \'\'}, \r\n {name: \'a\', value: \'\'}, \r\n {name: \'\xd0\xb4\', value: \'\'}, \r\n {name: \'\xd0\xb2\', value: \'\'}, \r\n {name: \'41\', value: \'\'}, \r\n {name: \'\xd0\xb0\', value: \'\'}, \r\n {name: \'\xd0\xb1\', value: \'\'}, \r\n {name: \'0\', value: \'\'}, \r\n {name: \'31\', value: \'\'}, \r\n {name: \'4\', value: \'\'}, \r\n {name: \'\xd0\xb3\', value: \'\'}\r\n]\r\n\r\nitems.sort(function (a, b) {\r\n // ascending order\r\n if (ascending) {\r\n return a.name.localeCompare(b.name, undefined, { numeric: true });\r\n }\r\n // descending order\r\n else {\r\n return b.name.localeCompare(a.name, undefined, { numeric: true });\r\n }\r\n})\r\n\r\n\r\nif (ascending == false) {\r\n var englishAlphabet = "abcdefghijklmnopqrstuvwxyz"\r\n let nums = []\r\n let english = []\r\n let other = []\r\n\r\n items.forEach(element => {\r\n if (isNaN(element.name[0]) == false) {\r\n nums.push(element)\r\n }\r\n else if (englishAlphabet.includes(element.name[0].toLowerCase())) {\r\n english.push(element)\r\n }\r\n else {\r\n other.push(element)\r\n }\r\n });\r\n\r\n let restructuredItems = nums.concat(english).concat(other)\r\n\r\n console.log(\'BEFORE RESTRUCTURING\', items);\r\n console.log(\'AFTER RESTRUCTURING: \', restructuredItems);\r\n}Run Code Online (Sandbox Code Playgroud)\r\n