├── .gitignore ├── .travis.yml ├── README.md ├── index.js ├── package.json └── test.js /.gitignore: -------------------------------------------------------------------------------- 1 | node_modules 2 | -------------------------------------------------------------------------------- /.travis.yml: -------------------------------------------------------------------------------- 1 | sudo: false 2 | language: node_js 3 | cache: 4 | directories: 5 | - node_modules 6 | node_js: 7 | - '0.12' 8 | - v4 9 | - stable 10 | after_success: 11 | - npm run semantic-release 12 | env: 13 | global: 14 | - secure: XXQWV+c3Axb+G3WtYt1Z2wjv1EVSny91D7DVMSgtKnd7TtxsPzfpy7iWPFxidxi4vFLbi35JC51BZ7BWnN1tmgiGbZtk6NkgG3amNyVE4RSvPAMOO5wCEe2SqXU+59aW+1s/kRGbuy5fA6pTL+OpGjVq0FIa0GmPxNSI13AEKs7pW8ijWdkM7MtY1q/Hw1HjIvZno4iW8gVkhznOlgw08iW2fk2l5dS/OMDXZgrn+OwfbZ1sIDdqF3RTnLoxngLuk8UvHMT9W0xiU/8O01HOXE9rp71hV/NYYiJk9Ghg4x/6ss9bt08p8s2MvM8QGNbVfyawPwEwSVvEfH8OdFm48btPmziFp/4HSINrgi2bUEziAvgttTX1K8TXI/P7DlvmKJLOoaprCfeicGSN/Q0vuIPQkVl2dziV7pk/BiVbjMpB8BQIZD2VJFrRvylzLDbrcy7gIcSn50nHpYqKevr6tnJ9VmioHeNbYwloYD+uBx0mby/I68Ii4y51gPKIYQ1lza4KtEIpjs3Vs4RrIuKTjd+0Fb6vXJL/uzjeokd3TDyVKi1AGRzS9RMccZUS5EaGHfOy19nMfWuL1snZ7GKIJZy7gI5IH3KpYV14YHw8hx0ExZmlWZmavGJPRsXN/ervfX3do7Alj7+KakkV8ip9KkJqxwPajXH80cJrfEncODY= 15 | - secure: yL3tp23cSwaHhrE7XzdOhrBpzyQgFpcT2b5CmFOoLaMOoIKd6Bq9rTd8un5egbFfTjivGEPx2+EfZs6qL0d496HomvGIWeLmNp+GZGL1ynCtrw8fDSQqNH7uguSlYsIAfNuV1x7N/9172rLLiNuIXB2/GNoLPJ4WbUJo/7aT5NE2MJvqYk7jWglkTtTYLoGhAd4aHVMfavC8hHqueXHFQ4VscvfDciaqwN+SfB35+tnTB4NMpslypmfd5c6bz3XHRVb8qKi3jgNe13ftcvbFkn6F3JO6gNI9omyESCGcjYIGzjPw5oKuYD4SAiEbiqIBwclU/oymFfTLBWE3Nq+pXjyUViTe6fV6mF1k+44OOg5XCCZPt6Q/JLQcK5TfQw2AkZkiUU6bQ/G43uhI+WZ1su4ka+eOGbLRv4D/rmZLv25ZVNlwVWb/8B/YmQqhX35Oi8m1M8Uq1QjpF+w2H13gRFa9R9qh0T82LnVIq6HBkIl2eBftHL1yL58bZ+D20tHRRm8soof8o3SuPXyILjcbKWyOrgO6TG+nwe6qLIWVGXW1Vkc1F8RiYsKeuI+wBenAqm8QReCO2lFqRArKze6XlKva8c+uB7rzHSYKj7tw96iu4yP9XRLL38kPMHgTEg94r+vyoMJCt8jwwfg52scC8HWl+yxwMnq1ZYdoSPT5UZA= 16 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Sort Object 2 | 3 | 4 | 5 | [![Build Status](https://travis-ci.org/keithamus/sort-object-keys.svg)](https://travis-ci.org/keithamus/sort-object-keys) 6 | 7 | Returns a copy of an object with all keys sorted. 8 | 9 | The second argument is optional and is used for ordering - to provide custom sorts. You can either pass an array containing ordered keys or a function to sort the keys (same signature as in [`Array.prototype.sort()`](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/sort)). 10 | 11 | ```js 12 | const assert = require('assert'); 13 | const sortObject = require('sort-object-keys'); 14 | 15 | assert.equal(JSON.stringify({ 16 | c: 1, 17 | b: 1, 18 | d: 1, 19 | a: 1, 20 | }), JSON.stringify({ 21 | a: 1, 22 | b: 1, 23 | c: 1, 24 | d: 1, 25 | })); 26 | 27 | assert.equal(JSON.stringify(sortObject({ 28 | c: 1, 29 | b: 1, 30 | d: 1, 31 | a: 1, 32 | }, ['b', 'a', 'd', 'c'])), JSON.stringify({ 33 | b: 1, 34 | a: 1, 35 | d: 1, 36 | c: 1, 37 | })); 38 | 39 | function removeKeyAncCompareIndex(keyA, keyB){ 40 | var a = parseInt(keyA.slice(4)); 41 | var b = parseInt(keyB.slice(4)); 42 | return a - b; 43 | } 44 | 45 | assert.equal(JSON.stringify(sortObject({ 46 | "key-1": 1, 47 | "key-3": 1, 48 | "key-10": 1, 49 | "key-2": 1, 50 | }, removeKeyAncCompareIndex)), JSON.stringify({ 51 | "key-1": 1, 52 | "key-2": 1, 53 | "key-3": 1, 54 | "key-10": 1, 55 | })); 56 | ``` 57 | -------------------------------------------------------------------------------- /index.js: -------------------------------------------------------------------------------- 1 | var has = (object, key) => Object.prototype.hasOwnProperty.call(object, key); 2 | 3 | module.exports = function sortObjectByKeyNameList(object, sortWith) { 4 | var keys; 5 | var sortFn; 6 | 7 | if (typeof sortWith === 'function') { 8 | sortFn = sortWith; 9 | } else { 10 | keys = sortWith; 11 | } 12 | 13 | var objectKeys = Object.keys(object); 14 | return (keys || []).concat(objectKeys.sort(sortFn)).reduce(function(total, key) { 15 | if (has(object, key)) { 16 | total[key] = object[key]; 17 | } 18 | return total; 19 | }, Object.create(null)); 20 | } 21 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "sort-object-keys", 3 | "version": "1.1.3", 4 | "description": "Sort an object's keys, including an optional key list", 5 | "keywords": [ 6 | "keys", 7 | "object", 8 | "sort" 9 | ], 10 | "homepage": "https://github.com/keithamus/sort-object-keys#readme", 11 | "bugs": { 12 | "url": "https://github.com/keithamus/sort-object-keys/issues" 13 | }, 14 | "license": "MIT", 15 | "author": "Keith Cirkel (http://keithcirkel.co.uk/)", 16 | "files": [ 17 | "index.js" 18 | ], 19 | "main": "index.js", 20 | "repository": { 21 | "type": "git", 22 | "url": "git+ssh://git@github.com/keithamus/sort-object-keys.git" 23 | }, 24 | "scripts": { 25 | "semantic-release": "travis-after-all && semantic-release pre && npm publish && semantic-release post", 26 | "test": "node test.js" 27 | }, 28 | "config": { 29 | "ghooks": { 30 | "pre-commit": "npm t", 31 | "commit-msg": "validate-commit-msg" 32 | } 33 | }, 34 | "devDependencies": { 35 | "ghooks": "^1.0.1", 36 | "semantic-release": "^4.3.5", 37 | "travis-after-all": "^1.4.4", 38 | "validate-commit-msg": "^2.4.1" 39 | } 40 | } 41 | -------------------------------------------------------------------------------- /test.js: -------------------------------------------------------------------------------- 1 | const assert = require('assert'); 2 | const sortObject = require('./'); 3 | 4 | assert.equal(JSON.stringify(sortObject({ 5 | c: 1, 6 | b: 1, 7 | d: 1, 8 | a: 1, 9 | })), JSON.stringify({ 10 | a: 1, 11 | b: 1, 12 | c: 1, 13 | d: 1, 14 | })); 15 | 16 | assert.equal(JSON.stringify(sortObject({ 17 | c: 1, 18 | b: 1, 19 | d: 1, 20 | a: 1, 21 | }, ['b', 'a', 'd', 'c'])), JSON.stringify({ 22 | b: 1, 23 | a: 1, 24 | d: 1, 25 | c: 1, 26 | })); 27 | 28 | function removeKeyAncCompareIndex(keyA, keyB){ 29 | var a = parseInt(keyA.slice(4)); 30 | var b = parseInt(keyB.slice(4)); 31 | return a - b; 32 | } 33 | 34 | assert.equal(JSON.stringify(sortObject({ 35 | "key-1": 1, 36 | "key-3": 1, 37 | "key-10": 1, 38 | "key-2": 1, 39 | }, removeKeyAncCompareIndex)), JSON.stringify({ 40 | "key-1": 1, 41 | "key-2": 1, 42 | "key-3": 1, 43 | "key-10": 1, 44 | })); 45 | 46 | assert.deepEqual(Object.keys(sortObject({ 47 | b: 1, 48 | a: 1, 49 | }, ['a', 'b', 'c', 'd'])), [ 50 | 'a', 51 | 'b' 52 | ]) 53 | --------------------------------------------------------------------------------