Coder Social home page Coder Social logo

smelukov / nano-equal Goto Github PK

View Code? Open in Web Editor NEW
19.0 2.0 5.0 22 KB

Ultra fast and compact implementation of deep equal without any production dependencies.

License: MIT License

JavaScript 100.00%
deep-equals comparison fast no-dependencies equality

nano-equal's Introduction

Build Status npm version

NanoEqual

Ultra fast and compact implementation of deep equal without any production dependencies.

Usage

npm install nano-equal --save
var nanoEqual = require('nano-equal');

if (nanoEqual(a, b)) {
    //....
}

What is that?

This is a compact and fast implementation of deep equal.

Deep equal is an algorithm that comparing two values. If the values are a scalar (string, bool, number), then comparing will be performed thru === operator.

If the values are an object (object, array, function), then comparing will be performed recursively.

Following of the object properties is not important:

var a = {prop1: 'some', prop2: 'some'};
var b = {prop2: 'some', prop1: 'some'};

nanoEqual(a, b); // true

But following of the array elements is important:

var a = [1, 2, 3];
var b = [3, 2, 1];

nanoEqual(a, b); // false

NaN values and some types of recursion are supported.

Benchmark

The list below is showing the performance comparison nano-equal with other libs:

nanoEqual: 1362.813ms
underscore: 3791.308ms
lodash: 7830.107ms
nodejs: 8272.956ms

nano-equal's People

Contributors

pivchenberg avatar smelukov avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar

nano-equal's Issues

False positive when a properties within an array item is modified

node: 8.9.0
npm: 5.5.1

The scenario below produces a false positive.

const ne = require('nano-equal');
let oa = { 'a': 1, 'b': [1, { 'c': 'd' }], e: { 'a': [1, 2, '2'] } };
let ob = { 'a': 1, 'b': [1, { 'c': 'd' }], e: { 'a': [1, 2, '2'] } };

console.log(ne(oa, ob) ? 'equal' : 'not equal'); // equal
ob.b[1].d = 1
console.log(ne(oa, ob) ? 'equal' : 'not equal') // equal <- incorrect

Also the below scenario

console.log(ne(oa, ob) ? 'equal' : 'not equal'); // equal
ob.b.c = 1// this is valid js although b is an array
console.log(ne(oa, ob) ? 'equal' : 'not equal') // equal <- incorrect

Testing deep equality gist has more tests

Incorrect result for cyclic objects

The example below is expected to return true but returns false:

var nanoEqual = require("nano-equal")

const a = {aaa: 123};
a.a = a;

const b = {aaa: 123};
b.a = {aaa: 123};
b.a.a = b;

nanoEqual(a,b); // โ†’ false

[bug] valueOf / toString

Remove please brackets after Object.prototype.valueOf() and Object.prototype.toString()

        if (a.valueOf !== Object.prototype.valueOf() && b.valueOf !== Object.prototype.valueOf()) {
            return a.valueOf() === b.valueOf();
        }

        if (a.toString !== Object.prototype.toString() && b.toString !== Object.prototype.toString()) {
            return a.toString() === b.toString();
        }

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    ๐Ÿ–– Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. ๐Ÿ“Š๐Ÿ“ˆ๐ŸŽ‰

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google โค๏ธ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.