如何按自定义非字母顺序对含target字段的数组进行复杂排序?
嘿,我完全懂你这个需求——要给数组里的对象按target字段里的特定标识做自定义排序,不是死板的字母顺序对吧?这事儿其实用JavaScript的Array.sort()结合自定义权重映射就能搞定,我给你一步步拆解:
1. 先定义你的自定义排序优先级
首先你得明确哪些标识要排在前面,哪些在后面。比如你想让memory排最前,然后是cpu-pct,最后是example,那我们可以创建一个权重映射对象,用数字来表示优先级:数字越小,排序越靠前。
// 自定义优先级:数字越小,排序越靠前 const sortPriority = { 'memory': 1, 'cpu-pct': 2, 'example': 3 };
你可以根据自己的实际需求调整这个对象的键值对,比如新增标识或者改变顺序都很方便。
2. 提取target里的核心标识
你的target格式是类似random.text.cpu-pct-0或者random.text.memory这样的,我们需要把每个target里的核心标识(比如cpu-pct、memory)提取出来,才能对应到上面的权重。写个简单的工具函数就行:
function getTargetIdentifier(target) { // 先按点分割字符串,取最后一段(比如从"random.text.cpu-pct-0"得到"cpu-pct-0") const lastPart = target.split('.').pop(); // 如果最后一段带数字后缀(比如"cpu-pct-0"),就去掉数字部分,留下核心标识;没有后缀的话直接返回原内容 return lastPart.split('-').slice(0, -1).join('-') || lastPart; }
这个函数的作用就是:
- 输入
random.text.cpu-pct-0→ 返回cpu-pct - 输入
random.text.memory→ 返回memory
3. 用Array.sort()完成排序
接下来就可以用数组的sort()方法,结合上面的权重和标识提取函数来实现自定义排序了。如果同一个标识下有带数字后缀的元素(比如cpu-pct-0、cpu-pct-1),我们还可以额外按数字从小到大排序:
// 假设这是你的原始数组 const originalArray = [ { target: 'random.text.cpu-pct-0', otherData: {} }, { target: 'random.text.cpu-pct-1', otherData: {} }, { target: 'random.text.cpu-pct-2', otherData: {} }, { target: 'random.text.example-0', otherData: {} }, { target: 'random.text.example-1', otherData: {} }, { target: 'random.text.memory', otherData: {} } ]; const sortedArray = originalArray.sort((a, b) => { // 提取两个元素的核心标识 const idA = getTargetIdentifier(a.target); const idB = getTargetIdentifier(b.target); // 获取各自的优先级,没在权重映射里的标识默认排最后(给个大数字99) const priorityA = sortPriority[idA] || 99; const priorityB = sortPriority[idB] || 99; // 先按自定义优先级排序 if (priorityA !== priorityB) { return priorityA - priorityB; } // 如果优先级相同(比如都是cpu-pct),按数字后缀从小到大排序 const lastPartA = a.target.split('.').pop(); const lastPartB = b.target.split('.').pop(); // 提取数字部分,没有数字的话默认设为0 const numA = parseInt(lastPartA.split('-').pop()) || 0; const numB = parseInt(lastPartB.split('-').pop()) || 0; return numA - numB; }); // 打印排序后的target字段看看效果 console.log(sortedArray.map(item => item.target));
运行这段代码后,输出的顺序会是:
[ 'random.text.memory', 'random.text.cpu-pct-0', 'random.text.cpu-pct-1', 'random.text.cpu-pct-2', 'random.text.example-0', 'random.text.example-1' ]
灵活调整的小技巧
- 如果不需要同标识下的数字排序,直接去掉函数里
if (priorityA !== priorityB)之后的代码就行。 - 如果有新的标识需要加入排序,只要在
sortPriority里新增对应的键值对(比如'disk': 4)就可以了。 - 如果想让某些标识排最后,给它们设置一个较大的权重值就行(比如
99)。
内容的提问来源于stack exchange,提问作者Bryan
相关产品推荐
相关产品推荐

