首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >基于值的数据库自定义排序数组

基于值的数据库自定义排序数组
EN

Stack Overflow用户
提问于 2022-09-13 20:49:53
回答 3查看 51关注 0票数 0

我有这样的阵列

代码语言:javascript
运行
复制
 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)}]

如何对数组进行排序,以使结果成为:

代码语言:javascript
运行
复制
 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);

代码语言:javascript
运行
复制
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;
  }
 }

但结果并不如我所料。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2022-09-13 21:07:09

评论中的解释。基本上,删除第一个元素,并根据自定义标记对其余元素进行排序。

代码语言:javascript
运行
复制
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))

票数 0
EN

Stack Overflow用户

发布于 2022-09-13 21:02:47

试试这个:

代码语言:javascript
运行
复制
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);

票数 0
EN

Stack Overflow用户

发布于 2022-09-13 21:08:06

您可以拆分字符串并对值使用一些调整。

代码语言:javascript
运行
复制
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);
代码语言:javascript
运行
复制
.as-console-wrapper { max-height: 100% !important; top: 0; }

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/73709028

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档