我想创建一个函数,用两个键对json对象进行排序,我传递给它作为参数,如下所示:
function sort_json_key1_then_key2(jsonObj, key_1, key_2) {
jsonObj.sort(function(a, b) {
if (a.key_1 == b.key_1) {
return a.key_2 == b.key_2 ? 0 : +a.key_2 > +b.key_2 ? 1 : -1;
}
return +a.key_1 > +b.key_1 ? 1 : -1;
});
}
以下面的json对象为例:
var obj = [
{"cl":"8","fare":"500.0","name":"41"},
{"cl":"7","fare":"200.0","name":"37"},
{"cl":"10","fare":"200.0","name":"33"},
{"cl":"9","fare":"500.0","name":"29"},
{"cl":"6","fare":"500.0","name":"29"}
];
我将函数调用'fare'然后按'cl'排序如下:
var sorted = sort_json_key1_then_key2(obj, 'fare', 'cl');
var json_string = JSON.stringify(sorted);
console.log(json_string);
但是我在控制台中输出'undefined'作为输出。我想我没有正确地传递密钥作为参数正确运行。关于如何解决这个问题的任何想法?
答案 0 :(得分:3)
您必须使用bracket notation instead of dot notation。另外,如果您希望函数返回结果,您应该实际返回已排序的数组。当.sort()
改变原始数组时,您可能希望通过将数组扩展为新数组([...jsonObj]
)来克隆数组,以便该函数是纯的:
function sort_json_key1_then_key2(jsonObj, key_1, key_2) {
return [...jsonObj].sort(function(a, b) {
if (a[key_1] == b[key_1]) {
return a[key_2] - b[key_2];
}
return a[key_1] - b[key_1];
});
}
var jsonObj = [{
"cl": "8",
"fare": "500.0",
"name": "41"
},
{
"cl": "7",
"fare": "200.0",
"name": "37"
},
{
"cl": "10",
"fare": "200.0",
"name": "33"
},
{
"cl": "9",
"fare": "500.0",
"name": "29"
},
{
"cl": "6",
"fare": "500.0",
"name": "29"
}
];
var sorted = sort_json_key1_then_key2(jsonObj, 'fare', 'cl');
console.log(sorted);