Skip welcome & menu and move to editor
Welcome to JS Bin
Load cached copy from
 
<!DOCTYPE html>
<html>
<head>
  <meta charset="utf-8">
  <title>JS Bin</title>
</head>
<body>
</body>
</html>
 
const typeOf = x => 
  ({}).toString
      .call(x)
      .match(/\[object (\w+)\]/)[1]
function areSimilar(a, b) {
  const everyKey = f => Object.keys(a).every(f)
  switch(typeOf(a)) {
    case 'Array':
      return a.length === b.length &&
        everyKey(k => areSimilar(a.sort()[k], b.sort()[k]));
    case 'Object':
      return Object.keys(a).length === Object.keys(b).length &&
        everyKey(k => areSimilar(a[k], b[k]));
    default:
      return a === b;
  }
}
//tests
console.clear();
console.assert(areSimilar({foo:'bar'}, {foo:'bar'}));
console.assert(!areSimilar({foo:'bar'}, {foo:'baz'}));
console.assert(areSimilar({}, {}));
console.assert(areSimilar({a:{}}, {a:{}}));
console.assert(!areSimilar({a:{b:[]}}, {a:{b:{}}}));
console.assert(areSimilar({a:{b:[2]}}, {a:{b:[2]}}));
console.assert(areSimilar({a:{b:[1, '{}']}}, {a:{b:[1, '{}']}}));
console.assert(areSimilar({a:{b:[1, '{}']}}, {a:{b:['{}', 1]}}));
console.assert(areSimilar({a:{b:[1, '{}', [3, '4', ['98']]]}}, {a:{b:[[['98'], 3, '4'], '{}', 1]}}));
console.assert(!areSimilar({a:{b:[1, null]}}, {a:{b:['{}', 1]}}));
console.assert(areSimilar({a:{b:[1, { bar: [1, 3, 2] }, '{}', null]}}, {a:{b:['{}', 1, {bar: [1, 2, 3]}, null]}}));
Output

This bin was created anonymously and its free preview time has expired (learn why). — Get a free unrestricted account

Dismiss x
public
Bin info
anonymouspro
0viewers