JS动态按变量指定key排序对象数组问题排查
JavaScript排序函数无法通过指定key参数排序的排查与解决
问题场景
编写了sortData函数,意图通过第二个参数sortBy指定对象的key(如'a')对对象数组排序,但使用objSort[i][sortBy]的写法无法完成排序,换成直接用对应key的点语法或正确的变量取值方式则可正常运行。
可运行的核心代码片段
if (objSort[i][sortBy] > objSort[j][sortBy]) { [objSort[i], objSort[j]] = [objSort[j], objSort[i]] }
无法运行的完整代码
function sortData(objSort, sortBy) { for (let i = 0; i < objSort.length; i++) { for (let j = i + 1; j < objSort.length; j++) { if (objSort[i][`sortBy`] > objSort[j][`sortBy`]) { [objSort[i], objSort[j]] = [objSort[j], objSort[i]] } } } console.log(data); } const data = [{ a: 4, b: 5 }, { a: 1, b: 10}, { a: 2, b: 5 }, { a: 14, b: 15 }, { a: 12, b: 3 }]; sortData(data,'a');
问题排查
核心错误是模板字符串的误用:
你在方括号中使用了`sortBy`,这会将sortBy作为字符串字面量处理,代码实际在尝试访问对象的"sortBy"属性——而你的数据对象里根本没有这个key,所以比较的都是undefined,自然不会产生排序效果。
解决方案
- 去掉模板字符串的反引号,直接用变量名作为方括号的索引,这样才能正确引用
sortBy参数传入的key值。 - 额外优化:函数最后
console.log(data)依赖全局变量,改为打印函数参数objSort更规范。
修正后的完整代码
function sortData(objSort, sortBy) { for (let i = 0; i < objSort.length; i++) { for (let j = i + 1; j < objSort.length; j++) { // 直接使用变量作为属性索引 if (objSort[i][sortBy] > objSort[j][sortBy]) { [objSort[i], objSort[j]] = [objSort[j], objSort[i]] } } } console.log(objSort); // 打印函数参数,避免依赖全局变量 } const data = [{ a: 4, b: 5 }, { a: 1, b: 10}, { a: 2, b: 5 }, { a: 14, b: 15 }, { a: 12, b: 3 }]; sortData(data,'a');
内容的提问来源于stack exchange,提问作者meesam raza
相关产品推荐
相关产品推荐

