const eq = (a, b) => { if (a === b) { return true; } if (a === null || b === null) { return false; } if (typeof a != "object" || typeof b != "object") { return false; } if (Array.isArray(a) !== Array.isArray(b)) { return false; } if (Object.keys(a).length !== Object.keys(b).length) { return false; } for (const k in a) { if (!b.hasOwnProperty(k)) { return false; } if (!eq(a[k], b[k])) { return false; } } return true; }; const keys = (ks, obj) => ks.reduce( (ret, k) => obj.hasOwnProperty(k) ? {...ret, [k]: obj[k]} : ret, {}, ); const difference = (a, b) => { const diff = new Set(a); for (const el of b) { diff.delete(el); } return diff; }; const log = o => console.error(JSON.stringify(o)); module.exports = { eq, keys, difference, log, };