Run details:
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.67 Safari/537.36
Chrome 70
Mac OS X 10.12.6
Desktop
6 years ago
Test name Executions per second
jsonata 4864.3 Ops/sec
simple 103051.5 Ops/sec
jspath 429871.4 Ops/sec
jmespath 153924.8 Ops/sec
control 225045.5 Ops/sec
HTML Preparation code:
AخA
 
1
<script type="text/javascript" language="javascript" src="https://cdn.jsdelivr.net/npm/jsonata@1.5.4/jsonata-es5.min.js"></script>
2
<script type="text/javascript" language="javascript" src="https://cdn.jsdelivr.net/npm/jspath@0.4.0/jspath.min.js"></script>
3
<script type="text/javascript" language="javascript" src="https://cdnjs.cloudflare.com/ajax/libs/jmespath/0.15.0/jmespath.min.js"></script>
4
<script type="text/javascript" language="javascript" src="https://prototype.imin.co/eventseries-sample.js"></script>
5
<script type="text/javascript" language="javascript" src="http://meta.imin.co/v2.js"></script>
Script Preparation code:
x
 
var get = p => o =>
   p.reduce((xs, x) => {
    if (Array.isArray(xs)) {
        return xs.map(get([x])).filter(y => y !== null).flat();
     } else {
        return (xs && xs[x]) ? xs[x] : null;
     }
   }, o);
function flattenCollection(collectionIndex) {
    if (collectionIndex.type === 'imin:CollectionIndex') {
    return Object.entries(collectionIndex['imin:index']).reduce(function(map, [k,v]) {
        map[k] = flattenCollection(v);
        return map;
       }, {});
  } else if (collectionIndex.type === 'imin:Collection') {
    return collectionIndex['imin:item'].reduce(function(map, item) {
        map[item.id] = item;
        return map;
       }, {});
  } else {
    return collectionIndex;
  }
}
Tests:
  • jsonata

     
    var jsonataResult = jsonata('subEvent.offers.acceptedPaymentMethod').evaluate(result).join('<br />');
  • simple

     
    var simpleResult = get(['subEvent','offers','acceptedPaymentMethod'])(result).join('<br />');
  • jspath

     
    var jsPathResult = JSPath.apply('.subEvent.offers.acceptedPaymentMethod', result).join('<br />');
  • jmespath

     
    var jmespathResult = jmespath.search(result, 'subEvent[].offers[].acceptedPaymentMethod[]').join('<br />');
  • control

     
    result.subEvent.map(s => s.offers.map(o => o.acceptedPaymentMethod)).flat(2).join('<br />')
  • jspath+predicates

     
    var jsPathResult = JSPath.apply('."imin:aggregateOffer".publicAdult{.price > 0 && .priceCurrency > "."}[-1]', result);
  • meta-index

     
    var jsPathResult = JSPath.apply('."imin:index"(.subClass | .enumeration).."imin:item"', window.imin.v2.meta);
  • meta-nameonly

     
    var jsPathResult = JSPath.apply('."imin:index"(.subClass | .enumeration)..name', window.imin.v2.meta);
  • meta-flatten

     
    var result = flattenCollection(window.imin.v2.meta);