How to deterministically verify that a JSON object hasn't been modified?

前端 未结 8 1737
忘了有多久
忘了有多久 2020-11-30 04:38

According to MDN documentation for JSON.stringify:

Properties of non-array objects are not guaranteed to be stringified in any particular order. Do

8条回答
  •  [愿得一人]
    2020-11-30 05:07

    Recently I've had a similar use case. Following code has no dependencies and works for all browsers:

    function stringify(obj) {
      var type = Object.prototype.toString.call(obj);
    
      // IE8 <= 8 does not have array map
      var map = Array.prototype.map || function map(callback) {
        var ret = [];
        for (var i = 0; i < this.length; i++) {
          ret.push(callback(this[i]));
        }
        return ret;
      };
    
      if (type === '[object Object]') {
        var pairs = [];
        for (var k in obj) {
          if (!obj.hasOwnProperty(k)) continue;
          pairs.push([k, stringify(obj[k])]);
        }
        pairs.sort(function(a, b) { return a[0] < b[0] ? -1 : 1 });
        pairs = map.call(pairs, function(v) { return '"' + v[0] + '":' + v[1] });
        return '{' + pairs + '}';
      }
    
      if (type === '[object Array]') {
        return '[' + map.call(obj, function(v) { return stringify(v) }) + ']';
      }
    
      return JSON.stringify(obj);
    };
    

    stringify([{b: {z: 5, c: 2, a: {z: 1, b: 2}}, a: 1}, [1, 2, 3]])

    '[{"a":1,"b":{"a":{"b":2,"z":1},"c":2,"z":5}},[1,2,3]]'

    stringify([{a: 1, b:{z: 5, c: 2, a: {b: 2, z: 1}}}, [1, 2, 3]])

    '[{"a":1,"b":{"a":{"b":2,"z":1},"c":2,"z":5}},[1,2,3]]'

提交回复
热议问题