![](/img/trans.png)
[英]how to sort array of object in js by property i.ecategoryname' in my dataset in alphabetical order using mergesort
[英]In JS, how to sort over an object array on a value that's based on an assigned order I've created, not alphabetical or numerical?
我有一个对象数组(objArr),我正在对数据表的多个值进行排序。 大多数字段可以按字母或数字排序,但其中一个(环境)基于我创建的顺序,我希望它们按 dev 排序,然后是 qa,然后是 prod。 我尝试想出一种将每个 object 环境与数值(在环境中)匹配的方法:
const environments = { dev: 1, qa: 2, prod: 3 }; const objArr = [ { name: 'alpha project', environment: 'qa', version: 2 }, { name: 'alpha project', environment: 'prod', version: 1 }, { name: 'alpha project', environment: 'dev', version: 1 }, { name: 'alpha project', environment: 'qa', version: 1 }, { name: 'alpha project', environment: 'dev', version: 2 }, { name: 'beta project', environment: 'dev', version: 1 } ] /** * sort by name, then environment, then version */ function sortArray(items) { return items.sort((a, b) => a.name.localeCompare(b.name) || environments[a.environment].localCompare(environments[b.environment]) || a.version.localeCompare(b.version) ); } const newArray = sortArray(objArr); console.log('newArray', newArray)
但是当我运行它时,我得到一个错误:
“消息”:“未捕获的 TypeError:环境 [a.environment].localCompare 不是函数”,“文件名”:“https://stacksnippets.net/js”,“lineno”:57,“colno”:37
显然我不能像这样使用 localCompare 。 有没有人有一个简单的解决方案?
您可以通过这种方式进行自定义排序 function
function sortArray(items) {
return items.sort((a, b) =>{
if(a.environment !== b.environment){ // check if environments are different
if(a.environment === 'dev'){return 1}
if(a.environment === 'prod'){return -1}
if(a.environment === 'qa'){return a.environment === 'prod' ? 1 : -1}
} else { //if they are not, just do a classic localCompare()
return a.name.localeCompare(b.name)
}
})
}
它应该处理我认为的所有情况
所以我要做的就是将原始数组分成 3 个,分别对它们进行排序,然后以正确的顺序将它们连接回来
localeCompare
适用于字符串,而不是数字,因此您只需减去它们。
const environments = { dev: 1, qa: 2, prod: 3 }; const objArr = [{ name: 'alpha project', environment: 'qa', version: 2 }, { name: 'alpha project', environment: 'prod', version: 1 }, { name: 'alpha project', environment: 'dev', version: 1 }, { name: 'alpha project', environment: 'qa', version: 1 }, { name: 'alpha project', environment: 'dev', version: 2 }, { name: 'beta project', environment: 'dev', version: 1 } ] /** * sort by name, then environment, then version */ function sortArray(items) { return items.sort((a, b) => a.name.localeCompare(b.name) || environments[a.environment] - environments[b.environment] || a.version - b.version ); } const newArray = sortArray(objArr); console.log('newArray', newArray)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.