在JS中,如何根据基于我创建的分配顺序(而不是字母或数字)的值对对象数组进行排序?



我有一个对象数组(objArr(,我正在对数据表的多个值进行排序。大多数字段可以按字母顺序或数字排序,但其中一个字段(环境(是基于我创建的顺序,我希望它们按dev、qa和prod排序

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)

但当我运行这个时,我会得到一个错误:

"消息":"未捕获的类型错误:environment[a.environment].localCompare不是函数";,"filename":"https://stacksnippets.net/js","lineno":57,"colno":37

显然我不能这样使用localCompare。有人对此有简单的解决方案吗?

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)

您可以通过这种方式制作自定义排序函数


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个,对它们进行单独排序,然后将它们按正确的顺序连接回来

最新更新