Skip welcome & menu and move to editor
Welcome to JS Bin
Load cached copy from
 
<!DOCTYPE html>
<html>
<head>
  <meta charset="utf-8">
  <meta name="viewport" content="width=device-width">
  <title>JS Bin</title>
</head>
<body>
</body>
</html>
 
// http://stackoverflow.com/a/35101824/1238344
function frequencies(/* {Array} */ a){
    return new Map([...new Set(a)].map(
        x => [x, a.filter(y => y === x).length]
    ));
}
frequencies.identifiedBy = function(a, ...keys){
    var normalized = [];
    a.forEach(obj => {
        var identity = keys.map(key => obj[key]);
        var first = normalized.find(candidate => {
            var candidateId = keys.map(key => candidate[key]);
            return !identity.reduce((unequal, val, i) => unequal || candidateId[i] !== val, false);
        });
        normalized.push(first || keys.reduce((o, key) => (o[key] = obj[key], o), {}));
    });
    return frequencies(normalized);
}
// ---
var similarObjects = [
    { id: 0, value: 'foo', name: 'apple ' },
    { id: 1, value: 'bar', name: 'orange' }, 
    { id: 0, value: 'foo', name: 'apple ' },
    { id: 2, value: 'baz', name: 'banana' },
    { id: 3, value: 'foo', name: 'apple ' },
    { id: 4, value: 'baz', name: 'apple ' }
];
var logger = (freq, o) => {
    var values = Object.keys(o).map(key => o[key]);
    console.log(`(${values.join(', ')}): ${freq}`);
};
frequencies.identifiedBy(similarObjects, 'id').forEach(logger); 
frequencies.identifiedBy(similarObjects, 'value').forEach(logger);
frequencies.identifiedBy(similarObjects, 'value', 'name').forEach(logger);
Output

You can jump to the latest bin by adding /latest to your URL

Dismiss x
public
Bin info
Digigizmopro
0viewers