sort object properties and JSON.stringify

后端 未结 22 2166
南方客
南方客 2020-11-28 05:44

My application has a large array of objects, which I stringify and save them to the disk. Unfortunately, when the objects in the array are manipulated, and sometimes replac

相关标签:
22条回答
  • 2020-11-28 06:21

    You can pass a sorted array of the property names as the second argument of JSON.stringify():

    JSON.stringify(obj, Object.keys(obj).sort())
    
    0 讨论(0)
  • 2020-11-28 06:21

    After all, it needs an Array that caches all keys in the nested object (otherwise it will omit the uncached keys.) The oldest answer is just plain wrong, because second argument doesn't care about dot-notation. So, the answer (using Set) becomes.

    function stableStringify (obj) {
      const keys = new Set()
      const getAndSortKeys = (a) => {
        if (a) {
          if (typeof a === 'object' && a.toString() === '[object Object]') {
            Object.keys(a).map((k) => {
              keys.add(k)
              getAndSortKeys(a[k])
            })
          } else if (Array.isArray(a)) {
            a.map((el) => getAndSortKeys(el))
          }
        }
      }
      getAndSortKeys(obj)
      return JSON.stringify(obj, Array.from(keys).sort())
    }
    
    0 讨论(0)
  • 2020-11-28 06:24

    Try:

    function obj(){
      this.name = '';
      this.os = '';
    }
    
    a = new obj();
    a.name = 'X',
    a.os = 'linux';
    JSON.stringify(a);
    b = new obj();
    b.os = 'linux';
    b.name = 'X',
    JSON.stringify(b);
    
    0 讨论(0)
  • 2020-11-28 06:24

    Extending AJP's answer, to handle arrays:

    function sort(myObj) {
        var sortedObj = {};
        Object.keys(myObj).sort().forEach(key => {
            sortedObj[key] = _.isPlainObject(myObj[key]) ? sort(myObj[key]) : _.isArray(myObj[key])? myObj[key].map(sort) : myObj[key]
        })
        return sortedObj;
    }
    
    0 讨论(0)
  • 2020-11-28 06:24

    Here is a clone approach...clone the object before converting to json:

    function sort(o: any): any {
        if (null === o) return o;
        if (undefined === o) return o;
        if (typeof o !== "object") return o;
        if (Array.isArray(o)) {
            return o.map((item) => sort(item));
        }
        const keys = Object.keys(o).sort();
        const result = <any>{};
        keys.forEach((k) => (result[k] = sort(o[k])));
        return result;
    }
    

    If is very new but seems to work on package.json files fine.

    0 讨论(0)
  • 2020-11-28 06:25

    This is same as Satpal Singh's answer

    function stringifyJSON(obj){
        keys = [];
        if(obj){
            for(var key in obj){
                keys.push(key);
            }
        }
        keys.sort();
        var tObj = {};
        var key;
        for(var index in keys){
            key = keys[index];
            tObj[ key ] = obj[ key ];
        }
        return JSON.stringify(tObj);
    }
    
    obj1 = {}; obj1.os="linux"; obj1.name="X";
    stringifyJSON(obj1); //returns "{"name":"X","os":"linux"}"
    
    obj2 = {}; obj2.name="X"; obj2.os="linux";
    stringifyJSON(obj2); //returns "{"name":"X","os":"linux"}"
    
    0 讨论(0)
提交回复
热议问题