如何在Javascript中为Array.sort传入动态比较逻辑
动态列排序二维数组的解决方案
你不需要通过字符串拼接生成比较逻辑,直接利用JavaScript的闭包和循环就能实现动态列的排序逻辑,而且更安全高效。
修正后的代码
function dynamicSort(table, columns){ table.sort((a, b) => { // 遍历所有指定的排序列 for (const col of columns) { const comparison = a[col].localeCompare(b[col]); // 如果当前列比较结果不为0,直接返回该结果 if (comparison !== 0) { return comparison; } } // 所有列都相等时返回0 return 0; }); } function testIt(){ var table = [['John','Doe'], ['Adam','Doe'], ['Sam','Adams'],['Bud','Wiser']]; var sortColumns=[1,0]; dynamicSort(table,sortColumns); for (row in table) console.log(table[row].join(", ")); }
为什么之前的方法失败
Array.sort() 要求传入的比较参数必须是函数或undefined,直接传字符串会触发你遇到的TypeError。即便用new Function(),正确写法也需要单独分离函数体字符串(而非完整的箭头函数字符串),但这种方式不仅冗余,还存在代码注入的安全风险,完全没必要。
代码说明
- 遍历传入的
columns数组,依次对每一列进行比较 - 只要某一列的比较结果不为0(即两元素不相等),就返回该结果,终止后续比较
- 所有列都相等时返回0,保持元素原有顺序(注:
sort()在V8引擎中已实现稳定排序)
这个方案支持任意数量的排序列,无需修改核心逻辑,完全适配你的动态需求。
内容的提问来源于stack exchange,提问作者LZ Steve
相关产品推荐
相关产品推荐

