diff --git a/index.js b/index.js index 191c6eb..c4cc274 100644 --- a/index.js +++ b/index.js @@ -430,16 +430,15 @@ function keysEqual(leftHandOperand, rightHandOperand, keys, options) { * @return {Boolean} result */ function objectEqual(leftHandOperand, rightHandOperand, options) { - var leftHandKeys = getEnumerableKeys(leftHandOperand).sort(); - var rightHandKeys = getEnumerableKeys(rightHandOperand).sort(); - var leftHandSymbols = getNonEnumerableSymbols(leftHandOperand).sort(); - var rightHandSymbols = getNonEnumerableSymbols(rightHandOperand).sort(); - + var leftHandKeys = getEnumerableKeys(leftHandOperand); + var rightHandKeys = getEnumerableKeys(rightHandOperand); + var leftHandSymbols = getNonEnumerableSymbols(leftHandOperand); + var rightHandSymbols = getNonEnumerableSymbols(rightHandOperand); leftHandKeys = leftHandKeys.concat(leftHandSymbols); rightHandKeys = rightHandKeys.concat(rightHandSymbols); if (leftHandKeys.length && leftHandKeys.length === rightHandKeys.length) { - if (iterableEqual(leftHandKeys, rightHandKeys) === false) { + if (iterableEqual(mapSymbols(leftHandKeys).sort(), mapSymbols(rightHandKeys).sort()) === false) { return false; } return keysEqual(leftHandOperand, rightHandOperand, leftHandKeys, options); @@ -475,3 +474,13 @@ function objectEqual(leftHandOperand, rightHandOperand, options) { function isPrimitive(value) { return value === null || typeof value !== 'object'; } + +function mapSymbols(arr) { + return arr.map(function mapSymbol(entry) { + if (typeof entry === 'symbol') { + return entry.toString(); + } + + return entry; + }); +} diff --git a/test/index.js b/test/index.js index 4f9c5fc..0f8f257 100644 --- a/test/index.js +++ b/test/index.js @@ -423,6 +423,27 @@ describe('Generic', function () { var objectB = { [symb]: 'a', b: 2 }; assert(eql(objectA, objectB) === true, 'eql(obj, obj) === true'); }); + + it('works for multiple symbols', function () { + var symb = Symbol('a'); + var symb2 = Symbol('a'); + var objectA = { [symb]: 'a', [symb2]: 'b' }; + var objectB = { [symb]: 'a', [symb2]: 'b' }; + assert(eql(objectA, objectB) === true, 'eql(obj, obj)'); + + objectA = { [symb]: 'a', [symb2]: 'b' }; + objectB = { [symb2]: 'b', [symb]: 'a' }; + assert(eql(objectA, objectB) === true, 'eql(obj, obj)'); + + objectA = { [symb]: 'a', [symb2]: 'b' }; + objectB = { [symb2]: 'a', [symb]: 'b' }; + assert(eql(objectA, objectB) === false, 'eql(obj, obj) === false'); + + var symb3 = Symbol(); + objectA = { [symb3]: 'a', [symb2]: 'b' }; + objectB = { [symb3]: 'a', [symb2]: 'b' }; + assert(eql(objectA, objectB) === true, 'eql(obj, obj)'); + }); });