diff --git a/src/forOwn.js b/src/forOwn.js index 0946f4c..a53c904 100644 --- a/src/forOwn.js +++ b/src/forOwn.js @@ -24,4 +24,5 @@ * * @returns {Boolean} true if the callback function returns a truthy value for any key; otherwise, false. */ -export default (object, callback) => !(!object || !Object.entries(object).some((data) => callback(data[1], data[0]))); +export default (object, callback) => !(!object || !Object.keys(object) + .some((key) => key in object ? callback(object[key], key) : false)); diff --git a/tests/forOwn.Test.js b/tests/forOwn.Test.js index 57291f4..b7d85a3 100644 --- a/tests/forOwn.Test.js +++ b/tests/forOwn.Test.js @@ -54,6 +54,31 @@ describe('forOwn', () => { assert.isTrue(isCanceled); }); + it('should NOT call the callback for keys that are deleted in a previous callback', () => { + let total = 0; + let testVar = 0; + const object = { + key1: 'something1', + key2: 'something2', + key3: 'something3' + }; + + const isCanceled = forOwn(object, (value, key) => { + total++; + if (key === 'key1' && value === 'something1') { + testVar++; + } + if (key === 'key2' && value === 'something2') { + testVar++; + delete object.key3; + } + }); + + assert.equal(total, 2); + assert.equal(testVar, 2); + assert.isFalse(isCanceled); + }); + it('should not call the callback for inherited properties', () => { let total = 0; let testVar = 0;