Skip to content

Commit a311421

Browse files
authored
fix: multiple symbols and sort fails - Cannot convert a Symbol value to a string (#83)
* fix: multiple symbols and sort fails - Cannot convert a Symbol value to a string * revert: #89 * refactor: no if check
1 parent 9586dfb commit a311421

File tree

2 files changed

+36
-6
lines changed

2 files changed

+36
-6
lines changed

index.js

+15-6
Original file line numberDiff line numberDiff line change
@@ -430,16 +430,15 @@ function keysEqual(leftHandOperand, rightHandOperand, keys, options) {
430430
* @return {Boolean} result
431431
*/
432432
function objectEqual(leftHandOperand, rightHandOperand, options) {
433-
var leftHandKeys = getEnumerableKeys(leftHandOperand).sort();
434-
var rightHandKeys = getEnumerableKeys(rightHandOperand).sort();
435-
var leftHandSymbols = getNonEnumerableSymbols(leftHandOperand).sort();
436-
var rightHandSymbols = getNonEnumerableSymbols(rightHandOperand).sort();
437-
433+
var leftHandKeys = getEnumerableKeys(leftHandOperand);
434+
var rightHandKeys = getEnumerableKeys(rightHandOperand);
435+
var leftHandSymbols = getNonEnumerableSymbols(leftHandOperand);
436+
var rightHandSymbols = getNonEnumerableSymbols(rightHandOperand);
438437
leftHandKeys = leftHandKeys.concat(leftHandSymbols);
439438
rightHandKeys = rightHandKeys.concat(rightHandSymbols);
440439

441440
if (leftHandKeys.length && leftHandKeys.length === rightHandKeys.length) {
442-
if (iterableEqual(leftHandKeys, rightHandKeys) === false) {
441+
if (iterableEqual(mapSymbols(leftHandKeys).sort(), mapSymbols(rightHandKeys).sort()) === false) {
443442
return false;
444443
}
445444
return keysEqual(leftHandOperand, rightHandOperand, leftHandKeys, options);
@@ -475,3 +474,13 @@ function objectEqual(leftHandOperand, rightHandOperand, options) {
475474
function isPrimitive(value) {
476475
return value === null || typeof value !== 'object';
477476
}
477+
478+
function mapSymbols(arr) {
479+
return arr.map(function mapSymbol(entry) {
480+
if (typeof entry === 'symbol') {
481+
return entry.toString();
482+
}
483+
484+
return entry;
485+
});
486+
}

test/index.js

+21
Original file line numberDiff line numberDiff line change
@@ -423,6 +423,27 @@ describe('Generic', function () {
423423
var objectB = { [symb]: 'a', b: 2 };
424424
assert(eql(objectA, objectB) === true, 'eql(obj, obj) === true');
425425
});
426+
427+
it('works for multiple symbols', function () {
428+
var symb = Symbol('a');
429+
var symb2 = Symbol('a');
430+
var objectA = { [symb]: 'a', [symb2]: 'b' };
431+
var objectB = { [symb]: 'a', [symb2]: 'b' };
432+
assert(eql(objectA, objectB) === true, 'eql(obj, obj)');
433+
434+
objectA = { [symb]: 'a', [symb2]: 'b' };
435+
objectB = { [symb2]: 'b', [symb]: 'a' };
436+
assert(eql(objectA, objectB) === true, 'eql(obj, obj)');
437+
438+
objectA = { [symb]: 'a', [symb2]: 'b' };
439+
objectB = { [symb2]: 'a', [symb]: 'b' };
440+
assert(eql(objectA, objectB) === false, 'eql(obj, obj) === false');
441+
442+
var symb3 = Symbol();
443+
objectA = { [symb3]: 'a', [symb2]: 'b' };
444+
objectB = { [symb3]: 'a', [symb2]: 'b' };
445+
assert(eql(objectA, objectB) === true, 'eql(obj, obj)');
446+
});
426447
});
427448

428449

0 commit comments

Comments
 (0)