Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/415.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript递归地对对象和嵌套对象以及数组排序_Javascript_Python_Sorting_Recursion - Fatal编程技术网

Javascript递归地对对象和嵌套对象以及数组排序

Javascript递归地对对象和嵌套对象以及数组排序,javascript,python,sorting,recursion,Javascript,Python,Sorting,Recursion,我试图获得与启用了按键排序的pythons json.dumps相同的结果。这是一个预请求脚本,供邮递员生成请求哈希。需要对输出进行排序,将其作为哈希输入。我是javascript新手,看到许多旧答案声称javascript中的对象无法排序。但是,必须有一个解决方案来生成给定条件的哈希 无法更改对象结构。 它只需要支持Chrome。 我可以使用图书馆。 requestParams可以包含嵌套对象和数组,这些对象和数组需要在任何深度进行排序。 这是我当前的代码。在Chrome控制台中,sorted

我试图获得与启用了按键排序的pythons json.dumps相同的结果。这是一个预请求脚本,供邮递员生成请求哈希。需要对输出进行排序,将其作为哈希输入。我是javascript新手,看到许多旧答案声称javascript中的对象无法排序。但是,必须有一个解决方案来生成给定条件的哈希

无法更改对象结构。 它只需要支持Chrome。 我可以使用图书馆。 requestParams可以包含嵌套对象和数组,这些对象和数组需要在任何深度进行排序。 这是我当前的代码。在Chrome控制台中,sortedResult的对象预览是未排序的,但是,当我展开对象和子对象时,Chrome控制台将sortedResult显示为已排序,这正是它应该显示的方式。这给我的印象是sortObject正在工作。但是,requestOrdered返回有效的json对象,但未对其进行排序。我最初的想法是,可能JSON.stringify正在取消排序

const requestRebuilt = {"username": user, "password": password, "sTime": time, "function": function,
                 "functionParams": requestParams, "salt": salt};

function sortObject(object){  
    var keys = _.keys(object);
    var sortedKeys = _.sortBy(keys, function(key){  
        //console.log(key);
        return key; 
    });
    var sortedObj = {};
    var sortedObjJson = "";

    for(var index in keys){
        var key = keys[index];
        //console.log(key + ' ' + typeof object[key]);

        if(typeof object[key] == 'object' && !(object[key] instanceof Array)){
            sortedObj[key] = sortObject(object[key]);
        } else if(object[key] instanceof Array) {
            //sortedObj[key] = object[key].sort();
            var arrayLength = object[key].length;
            for (var i = 0; i < arrayLength; i++) {
                sortedObj[key] = sortObject(object[key][i]);
                //console.log(object[key][i]);
            }
        } else {
            sortedObj[key] = object[key];
        }
    }
    return sortedObj;
}
const sortedResult = sortObject(requestRebuilt);
console.log(sortedResult);

const requestOrdered = JSON.stringify(sortedResult);
console.log(requestOrdered);

var hash = CryptoJS.SHA256(requestOrdered).toString();
postman.setGlobalVariable("hash", hash);
在python中,这是通过以下操作完成的:

ordered = json.dumps(
   {"username": user, "password": password, "time": time, "function": function, "functionParams": functionParams, "salt": salt}
    sort_keys=True, separators=(',', ':'))
订购结果:

{"function":"begin","functionParams":{"passenger":[{"bans":{"count":2,"weight":9},"dateOfBirth":"1915-10-02T00:00:00Z","email":"jdoe@mail.com","firstName":"John","phone":1234567890}],"pad":4,"tip":"ABC123FFG"},"pep":"sdeODQ0T","salt":"00d878f5e203","sTime":"2016-03-04T13:53:37Z","username":"jdoe@mail.com"}
打印精美,便于阅读,但实际结果不应有空格或新行:


在javascript中对象键没有顺序是一个常见的误解。那

尽管ECMAScript使对象的迭代顺序依赖于实现,但似乎所有主要浏览器都支持基于最早添加的属性的迭代顺序,至少对于不在原型上的属性是这样

以及:

对于作为字符串但不是整数索引的O的每个自己的属性键p,按属性创建顺序

也就是说,除非使用delete,否则对象属性总是按插入顺序迭代,这一点可以依赖,有关详细信息,请参见

因此,要对某个对象中的键进行排序,只需创建一个新对象并按排序顺序向其添加键:

函数sortKeysx{ 如果typeof x!=“对象”| |!x 返回x; if Array.isArrayx 返回x.mapsortKeys; 返回Object.keysx.sort.reduceo,k=>{…o[k]:sortKeysx[k]},{}; } //// obj={ 用户名:jdoe@mail.com, 时间:2016-03-04T13:53:37Z, 功能:开始, 函数参数:{ 提示:ABC123FFG, pad:4, 乘客:[{ 名字:约翰, 电话:1234567890, 电邮:jdoe@mail.com, 出生日期:1915-10-02T00:00:00Z, 禁令:{ 体重:9, 计数:2 } } ] }, 盐:00d878f5e203, 政治公众人物:sdeODQ0T } 排序=sortKeysobj;
console.logsorted 在javascript中对象键没有顺序是一个常见的误解。那

尽管ECMAScript使对象的迭代顺序依赖于实现,但似乎所有主要浏览器都支持基于最早添加的属性的迭代顺序,至少对于不在原型上的属性是这样

以及:

对于作为字符串但不是整数索引的O的每个自己的属性键p,按属性创建顺序

也就是说,除非使用delete,否则对象属性总是按插入顺序迭代,这一点可以依赖,有关详细信息,请参见

因此,要对某个对象中的键进行排序,只需创建一个新对象并按排序顺序向其添加键:

函数sortKeysx{ 如果typeof x!=“对象”| |!x 返回x; if Array.isArrayx 返回x.mapsortKeys; 返回Object.keysx.sort.reduceo,k=>{…o[k]:sortKeysx[k]},{}; } //// obj={ 用户名:jdoe@mail.com, 时间:2016-03-04T13:53:37Z, 功能:开始, 函数参数:{ 提示:ABC123FFG, pad:4, 乘客:[{ 名字:约翰, 电话:1234567890, 电邮:jdoe@mail.com, 出生日期:1915-10-02T00:00:00Z, 禁令:{ 体重:9, 计数:2 } } ] }, 盐:00d878f5e203, 政治公众人物:sdeODQ0T } 排序=sortKeysobj;
console.logsorted;对象键在JavaScript中没有顺序。因此,您不能使用JSON.stringify来实现这一点。有什么解决方法吗?如果javascript无法保持顺序,如何正确地散列对象?正如您所指出的,在javascript中无法对对象键进行排序。相反,您可以创建一个排序为['key1','value1'],['key2','value2']]的数组,以保留您感兴趣的顺序,即对象键在JavaScript中没有顺序。因此,您不能使用JSON.stringify来实现这一点。有什么解决方法吗?如果javascript无法保持顺序,如何正确地散列对象?正如您所指出的,在javascript中无法对对象键进行排序。相反,您可以创建一个排序为['key1',value1'],['key2',value2']]的数组来保留y的顺序 你对inNice感兴趣!我只需要替换x的IFTYPE!='iftypeof x!==的对象对象“| | x===null以防止它在null值上绊倒!我只需要替换x的IFTYPE!='iftypeof x!==的对象对象“| | x===null,以防止它在null值上绊倒
{"function":"begin","functionParams":{"passenger":[{"bans":{"count":2,"weight":9},"dateOfBirth":"1915-10-02T00:00:00Z","email":"jdoe@mail.com","firstName":"John","phone":1234567890}],"pad":4,"tip":"ABC123FFG"},"pep":"sdeODQ0T","salt":"00d878f5e203","sTime":"2016-03-04T13:53:37Z","username":"jdoe@mail.com"}
    {
      "function": "begin",
      "functionParams": {
        "passenger": [
          {
            "bans": {
              "count": 2,
              "weight": 9
            },
            "dateOfBirth": "1915-10-02T00:00:00Z",
            "email": "jdoe@mail.com",
            "firstName": "John",
            "phone": 1234567890
          }
        ],
        "pad": 4,
        "tip": "ABC123FFG"
      },
      "pep": "sdeODQ0T",
      "salt": "00d878f5e203",
      "sTime": "2016-03-04T13:53:37Z",
      "username": "jdoe@mail.com"
    }