我有这样的阵列
array = [
{name: '0:homdel', data: Array(3)},
{name: '1:LOH', data: Array(5)},
{name: '2:het', data: Array(5)},
{name: '2:LOH', data: Array(5)},
{name: '3-4:het', data: Array(5)},
{name: '3-4:LOH', data: Array(5)} ,
{name: '5-8:het', data: Array(5)},
{name: '5-8:LOH', data: Array(5)},
{name: '9+:het', data: Array(5)},
{name: '9+:LOH', data: Array(5)}]
如何对数组进行排序,以使结果成为:
sort =
[{name: '0:homdel', data: Array(3)},
{name: '1:LOH', data: Array(5)},
{name: '2:LOH', data: Array(5)},
{name: '3-4:LOH', data: Array(5)},
{name: '5-8:LOH', data: Array(5)},
{name: '9+:LOH', data: Array(5)},
{name: '2:het', data: Array(5)} ,
{name: '3-4:het', data: Array(5)},
{name: '5-8:het', data: Array(5)} ,
{name: '9+:het', data: Array(5)} ]
我试过array.sort(customSort);
function customSort(a, b) {
let [countA, nameA] = a.name.split(':');
let [countB, nameB] = b.name.split(':');
let nameComparison = nameA.localeCompare(nameB);
let countComparison = parseInt(countA) - parseInt(countB);
if (nameComparison == 0) {
return countComparison;
} else {
return nameComparison;
}
}
但结果并不如我所料。
发布于 2022-09-13 21:07:09
评论中的解释。基本上,删除第一个元素,并根据自定义标记对其余元素进行排序。
let array = [
{name: '0:homdel', data: Array(3)},
{name: '1:LOH', data: Array(5)},
{name: '2:het', data: Array(5)},
{name: '2:LOH', data: Array(5)},
{name: '3-4:het', data: Array(5)},
{name: '3-4:LOH', data: Array(5)} ,
{name: '5-8:het', data: Array(5)},
{name: '5-8:LOH', data: Array(5)},
{name: '9+:het', data: Array(5)},
{name: '9+:LOH', data: Array(5)}]
const thesort = (arr) => {
// first grab the obj that is not getting sorted
let first = arr.shift();
// add the sortable tag
let narr = arr.map(a => ({ ...a,
tag: a.name.split(":")[1]
}))
.sort((a, b) => b.tag.localeCompare(a.tag)) // sort it
.map(a => { delete a.tag; return a }); // remove the custom tag
narr.unshift(first)
return narr
}
console.log(thesort(array))
发布于 2022-09-13 21:02:47
试试这个:
const array = [ {name: '0:homdel'}, {name: '1:LOH'}, {name: '2:het'}, {name: '2:LOH'}, {name: '3-4:het'}, {name: '3-4:LOH'} , {name: '5-8:het'}, {name: '5-8:LOH'}, {name: '9+:het'}, {name: '9+:LOH'} ];
const sorted = array.sort(({ name: a }, { name: b }) => {
if(b === '0:homdel') return 1;
else if(a === '0:homdel') return -1;
const [, nameA] = a.split(':'), [, nameB] = b.split(':');
return nameB.localeCompare(nameA);
});
console.log(sorted);
发布于 2022-09-13 21:08:06
您可以拆分字符串并对值使用一些调整。
const
array = [{ name: '0:homdel', data: [] }, { name: '1:LOH', data: [] }, { name: '2:het', data: [] }, { name: '2:LOH', data: [] }, { name: '3-4:het', data: [] }, { name: '3-4:LOH', data: [] }, { name: '5-8:het', data: [] }, { name: '5-8:LOH', data: [] }, { name: '9+:het', data: [] }, { name: '9+:LOH', data: [] }];
array.sort(({ name: a }, { name: b }) => {
const
split = s => {
let [value, text] = s.split(':');
if (value.includes('+')) {
value = parseInt(value) + .1;
} else if (value.includes('-')) {
let v = value.split('-').map(Number);
value = (v[0] + v[1]) / 2;
}
return { value, text };
},
aa = split(a),
bb = split(b);
order = { homdel: 1, LOH: 2, het: 3 };
return order[aa.text] - order[bb.text] || aa.value - bb.value
});
console.log(array);
.as-console-wrapper { max-height: 100% !important; top: 0; }
https://stackoverflow.com/questions/73709028
复制相似问题