如何将json对象键作为参数传递给函数

时间:2018-04-11 13:49:18

标签: javascript arguments

我想创建一个函数,用两个键对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'作为输出。我想我没有正确地传递密钥作为参数正确运行。关于如何解决这个问题的任何想法?

1 个答案:

答案 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);