1234567891011121314151617181920212223242526272829303132333435363738394041424344 |
- 'use strict';
- var isPlainObj = require('is-plain-obj');
- module.exports = function (obj, opts) {
- if (!isPlainObj(obj)) {
- throw new TypeError('Expected a plain object');
- }
- opts = opts || {};
- // DEPRECATED
- if (typeof opts === 'function') {
- opts = {compare: opts};
- }
- var deep = opts.deep;
- var seenInput = [];
- var seenOutput = [];
- var sortKeys = function (x) {
- var seenIndex = seenInput.indexOf(x);
- if (seenIndex !== -1) {
- return seenOutput[seenIndex];
- }
- var ret = {};
- var keys = Object.keys(x).sort(opts.compare);
- seenInput.push(x);
- seenOutput.push(ret);
- for (var i = 0; i < keys.length; i++) {
- var key = keys[i];
- var val = x[key];
- ret[key] = deep && isPlainObj(val) ? sortKeys(val) : val;
- }
- return ret;
- };
- return sortKeys(obj);
- };
|