繁体   English   中英

在 JS 中,如何根据我创建的指定顺序(不是字母或数字)对 object 数组进行排序?

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM