Lodash Playground

Play with lodash functions

HTML

<script src="https://cdn.jsdelivr.net/npm/lodash@3.10.1/index.min.js"></script>

Babel + JSX

var temp1 = [
	{
  	key1: 'val1',
    key2: [
      {
        subKey1: 'subVal1',
        subKey2: ['34', '35']
      },
      {
        subKey1: 'subVal2',
        subKey2: ['24', '25']
      }
    ]
  },
  {
  	key3: 'val2',
    key4: [
      {
        subKey1: 'subVal3',
        subKey2: ['14', '15']
      },
      {
        subKey1: 'subVal4',
        subKey2: ['44', '45']
      }
    ]
  }
]

var temp2 = [
	{
  	key3: 'val2',
    key4: [
      {
        subKey1: 'subVal4',
        subKey2: ['45', '44']
      },
      {
        subKey1: 'subVal3',
        subKey2: ['14', '15']
      }
    ]
  },
  {
  	key1: 'val1',
    key2: [
      {
        subKey1: 'subVal2',
        subKey2: ['24', '25']
      },
      {
        subKey1: 'subVal1',
        subKey2: ['34', '35']
      }
    ]
  }
]

function deepEqual(data1, data2) {
  data1 = _.cloneDeep(data1);
  data2 = _.cloneDeep(data2);
  function isDeepEqual(val1, val2) {
    if (_.isArray(val1) && _.isArray(val2)) {
      if (val1.length === val2.length) {
        for (let id1 in val1) {
          let hasMatch = false;
          let matchOnIndex = -1;
          for (let id2 in val2) {
            if (isDeepEqual(val1[id1], val2[id2])) {
              hasMatch = true;
              matchOnIndex = id2;
              break;
            }
          }
          if (hasMatch) {
            val2.splice(matchOnIndex, 1);
          } else {
            return false;
          }
        }
        return true;
      } else {
        return false;
      }
    }

    if (_.isPlainObject(val1) && _.isPlainObject(val2)) {
      if (Object.keys(val1).length === Object.keys(val2).length) {
        for (let temp1 in val1) {
          if (!isDeepEqual(val1[temp1], val2[temp1])) {
            return false;
          }
        }
        return true;
      } else {
        return false;
      }
    }
    return _.isEqual(val1, val2);
  }

  return isDeepEqual(data1, data2);
}

console.log(_.isEqual(temp1,...