diff --git a/index.js b/index.js index 5641356..93e7f00 100755 --- a/index.js +++ b/index.js @@ -253,6 +253,7 @@ function walk (root, cb, immutable) { // use return values to update if defined var ret = cb.call(state, state.node); if (ret !== undefined && state.update) state.update(ret); + state.keys = null; if (modifiers.before) modifiers.before.call(state, state.node); if (!keepGoing) return state; @@ -261,7 +262,7 @@ function walk (root, cb, immutable) { && state.node !== null && !state.circular) { parents.push(state); - var keys = Object.keys(state.node); + var keys = state.keys || Object.keys(state.node); keys.forEach(function (key, i) { path.push(key); diff --git a/test/keys.js b/test/keys.js new file mode 100644 index 0000000..f6f5d0c --- /dev/null +++ b/test/keys.js @@ -0,0 +1,30 @@ +var assert = require('assert'); +var Traverse = require('traverse'); + +exports['sort test'] = function () { + var acc = []; + Traverse({ + a: 30, + b: 22, + id: 9 + }).forEach(function (node) { + if ((! Array.isArray(node)) && typeof node === 'object') { + this.before(function(node) { + this.keys = Object.keys(node); + this.keys.sort(function(a, b) { + a = [a === "id" ? 0 : 1, a]; + b = [b === "id" ? 0 : 1, b]; + return a < b ? -1 : a > b ? 1 : 0; + }); + }); + } + if (this.isLeaf) acc.push(node); + }); + + assert.equal( + acc.join(' '), + '9 30 22', + 'Traversal in a custom order' + ); +}; +