JSFiddle - React, Tailwind, and code Playground

by Warwick Grigg

HTML

<script src="//cdn.jsdelivr.net/ramda/latest/ramda.min.js"></script>
<pre></pre>

JavaScript

var list1 = [
    { Id: 1, Date: '2015-01-01', Foo:1, Bar:2 },
    { Id: 1, Date: '2015-02-01', Foo:1, Bar:2 },       
    { Id: 2, Date: '2015-01-03', Foo:3, Bar:3 },
    { Id: 5, Date: '2015-01-09', Foo:3, Bar:3 },
    ];

var list2 = [
    { Id: 1, Date: '2015-01-01', Foo:1, Bar:2 },
    { Id: 2, Date: '2015-01-03', Foo:3, Bar:3 },
    { Id: 3, Date: '2015-02-03', Foo:8, Bar:8 },
    ];

var predicateListFunc = function (props) {
    return R.allPass(R.map(R.curry(R.eqProps), props));
}
var compareProperties = R.unapply(predicateListFunc);

var mergeLists = R.unionWith(compareProperties("Id", "Date"));
var groupById = R.groupBy(R.prop("Id"));
var getGroups = R.compose(R.toPairs, groupById, mergeLists);

var groups = getGroups(list1, list2);

var result = JSON.stringify(groups, null, 4)
document.getElementsByTagName("pre")[0].innerHTML = result;