diff --git a/lib/extended_json.js b/lib/extended_json.js index 24b17b3a..bfb03c35 100644 --- a/lib/extended_json.js +++ b/lib/extended_json.js @@ -169,9 +169,15 @@ const BSON_INT32_MAX = 0x7fffffff, * console.log(EJSON.stringify(doc)); */ function stringify(value, replacer, space, options) { - if (space != null && typeof space === 'object') (options = space), (space = 0); - if (replacer != null && typeof replacer === 'object') - (options = replacer), (replacer = null), (space = 0); + if (space != null && typeof space === 'object') { + options = space; + space = 0; + } + if (replacer != null && typeof replacer === 'object' && !Array.isArray(replacer)) { + options = replacer; + replacer = null; + space = 0; + } options = Object.assign({}, { relaxed: true }, options); const doc = Array.isArray(value) diff --git a/test/node/extended_json_tests.js b/test/node/extended_json_tests.js index b576354f..754992b2 100644 --- a/test/node/extended_json_tests.js +++ b/test/node/extended_json_tests.js @@ -253,4 +253,22 @@ describe('Extended JSON', function() { expect(result.test).to.equal(34.12); expect(result.test).to.be.a('number'); }); + + it('should work for function-valued and array-valued replacer parameters', function() { + const doc = { a: new Int32(10), b: new Int32(10) }; + + var replacerArray = ['a', '$numberInt']; + var serialized = EJSON.stringify(doc, replacerArray, 0, { relaxed: false }); + expect(serialized).to.equal('{"a":{"$numberInt":"10"}}'); + + serialized = EJSON.stringify(doc, replacerArray); + expect(serialized).to.equal('{"a":10}'); + + var replacerFunc = function (key, value) { return key === 'b' ? undefined : value; } + serialized = EJSON.stringify(doc, replacerFunc, 0, { relaxed: false }); + expect(serialized).to.equal('{"a":{"$numberInt":"10"}}'); + + serialized = EJSON.stringify(doc, replacerFunc); + expect(serialized).to.equal('{"a":10}'); + }); });