sort object properties and JSON.stringify

后端 未结 22 2328
南方客
南方客 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:27

    Update 2018-7-24:

    This version sorts nested objects and supports array as well:

    function sortObjByKey(value) {
      return (typeof value === 'object') ?
        (Array.isArray(value) ?
          value.map(sortObjByKey) :
          Object.keys(value).sort().reduce(
            (o, key) => {
              const v = value[key];
              o[key] = sortObjByKey(v);
              return o;
            }, {})
        ) :
        value;
    }
    
    
    function orderedJsonStringify(obj) {
      return JSON.stringify(sortObjByKey(obj));
    }
    

    Test case:

      describe('orderedJsonStringify', () => {
        it('make properties in order', () => {
          const obj = {
            name: 'foo',
            arr: [
              { x: 1, y: 2 },
              { y: 4, x: 3 },
            ],
            value: { y: 2, x: 1, },
          };
          expect(orderedJsonStringify(obj))
            .to.equal('{"arr":[{"x":1,"y":2},{"x":3,"y":4}],"name":"foo","value":{"x":1,"y":2}}');
        });
    
        it('support array', () => {
          const obj = [
            { x: 1, y: 2 },
            { y: 4, x: 3 },
          ];
          expect(orderedJsonStringify(obj))
            .to.equal('[{"x":1,"y":2},{"x":3,"y":4}]');
        });
    
      });
    

    Deprecated answer:

    A concise version in ES2016. Credit to @codename , from https://stackoverflow.com/a/29622653/94148

    function orderedJsonStringify(o) {
      return JSON.stringify(Object.keys(o).sort().reduce((r, k) => (r[k] = o[k], r), {}));
    }
    

提交回复
热议问题