title: Dynamically group or filter objects within an array that share a given property name and value
body: <p>I want to iterate through an <code>array loop</code> and do stuff according to the property name and value of the objects within the <code>array</code>.</p>
  
  <p>The <code>array</code> is retrieved from a very "flat" <code>JSON</code> file, that is a collection of <code>git</code> commit logs from several <code>git</code> repositories (parsed to <code>JSON</code> from <code>bash</code> through <a href="https://github.com/dreamyguy/git-log-to-json/" rel="nofollow">this project</a>).</p>
  
  <p>Some of the things I would like to do would be:</p>
  
  <ul>
  <li>sort the commits by their timestamp.</li>
  <li>filter them by <em>repository</em>, and then do things with the data.</li>
  <li>filter them by <em>author_email</em>, and then do things with the data.</li>
  <li>calculate <em>impact</em> on each <em>repository</em> recursively.</li>
  </ul>
  
  <p>But what I'm mostly interested in is <strong>how can I select/group/filter all commits that share a certain property value (like <em>repository</em> or <em>author_email</em> or <em>date_day_week</em>) without specifying any explicit value?</strong></p>
  
  <p>I have done it manually (see 7th line from bottom to top in the block of code below):</p>
  
  <pre><code>// == request and parse JSON data == //
  // define data source
  var data_source = "src/json/data.json";
  // request the data
  var xhr = new XMLHttpRequest();
  xhr.open("GET", data_source);
  xhr.onreadystatechange = function () {
      if (this.readyState !== 4) { return; }
      if ((this.status &gt;= 200 &amp;&amp; this.status &lt; 300) || this.status === 0) {
          // get raw data
          data_JSON = this.responseText;
          // parse JSON data to JavaScript format
          data_parsed = JSON.parse(data_JSON);
          // manipulate data 'outside' the xhr request to keep things tidy
          manipulateData(data_parsed);
      } else {
          console.log('There was an error completing the XMLHttpRequest...');
      }
  };
  xhr.send();
  
  // create a callback function to do stuff 'outside' xhr
  function manipulateData(object){
      // define root object
      var commit = object.commits;
      // loop through every item so that we can iterate with them
      for (var i = 0; i &lt; commit.length; i++){
          // define 'commit[i]' as 'item' so that code is more legible
          var item = commit[i];
          // list property names and their values on console
          for (var key in item) {
              if (item.hasOwnProperty(key)) {
                  // list only items under 'lemon' repository &lt;-- this is where I need it to be generic so I can group/filter all items under a common repository and do things with it
                  if (item.repository == 'lemon') {
                      console.log(key + " -&gt; " + item[key]);
                  }
              }
          }
      }
  }
  </code></pre>
  
  <p>But what I would like to do is to group/filter all commits that share a given property value (i.e. repository <em>lemon</em>, <em>apple</em>, <em>orange</em>, etc) together dynamically. Once I know how to do that, I'll hopefully be able to do the same with other property names that may share property values, like <em>author_email</em>, <em>date_day_week</em>, <em>date_month_name</em>, <em>insertions</em>, etc.</p>
  
  <p>Below is the original <code>data.json</code> file, declared as a variable at <code>var data_source = "src/json/data.json";</code>:</p>
  
  <pre><code>{
      "commits":[
          {
              "repository":"lemon",
              "commit_nr":"1",
              "commit_hash":"146b76e91a269a9c06dcc4eb6854f76a7900a08e",
              "commit_hash_abbreviated":"146b76e",
              "tree_hash":"4090f728f1759a16df7dde49bf86f7536354ae02",
              "tree_hash_abbreviated":"4090f72",
              "parent_hashes":"",
              "parent_hashes_abbreviated":"",
              "author_email":"bogus@name.com",
              "date_day_week":"Fri",
              "date_month_name":"Feb",
              "date_month_day":"25",
              "date_hour":"09:59:17",
              "date_year":"2011",
              "date_hour_gmt":"-0800",
              "author_date_unix_timestamp":"1298656757",
              "date_iso_8601":"2011-02-25",
              "committer_email":"bogus@name.com",
              "files_changed":"46",
              "insertions":"3162",
              "deletions":"",
              "impact":"3162"
          },
          {
              "repository":"lemon",
              "commit_nr":"2",
              "commit_hash":"d6c8de134e0ee33b3837795250c9fffa02e57738",
              "commit_hash_abbreviated":"d6c8de1",
              "tree_hash":"f4ec855ed6c4402304500a68a74ff38943a47d3d",
              "tree_hash_abbreviated":"f4ec855",
              "parent_hashes":"146b76e91a269a9c06dcc4eb6854f76a7900a08e",
              "parent_hashes_abbreviated":"146b76e",
              "author_email":"bogus@name.com",
              "date_day_week":"Fri",
              "date_month_name":"Feb",
              "date_month_day":"25",
              "date_hour":"11:27:24",
              "date_year":"2011",
              "date_hour_gmt":"-0800",
              "author_date_unix_timestamp":"1298662044",
              "date_iso_8601":"2011-02-25",
              "committer_email":"bogus@name.com",
              "files_changed":"5",
              "insertions":"46",
              "deletions":"40",
              "impact":"6"
          },
          {
              "repository":"lemon",
              "commit_nr":"3",
              "commit_hash":"9a27e12968397923df17a424672447eee06ea248",
              "commit_hash_abbreviated":"9a27e12",
              "tree_hash":"5ceb1539ee9879f7d9043123ee36c4c44c93e64c",
              "tree_hash_abbreviated":"5ceb153",
              "parent_hashes":"d6c8de134e0ee33b3837795250c9fffa02e57738",
              "parent_hashes_abbreviated":"d6c8de1",
              "author_email":"bogus@name.com",
              "date_day_week":"Fri",
              "date_month_name":"Feb",
              "date_month_day":"25",
              "date_hour":"11:52:09",
              "date_year":"2011",
              "date_hour_gmt":"-0800",
              "author_date_unix_timestamp":"1298663529",
              "date_iso_8601":"2011-02-25",
              "committer_email":"bogus@name.com",
              "files_changed":"6",
              "insertions":"151",
              "deletions":"81",
              "impact":"70"
          },
          {
              "repository":"apple",
              "commit_nr":"1",
              "commit_hash":"61180570cb0cbc2233f841436d924ab43eeb7c7e",
              "commit_hash_abbreviated":"6118057",
              "tree_hash":"f652101ca189f92fc70767203879af9aeb9cec1e",
              "tree_hash_abbreviated":"f652101",
              "parent_hashes":"",
              "parent_hashes_abbreviated":"",
              "author_email":"bogus@name.com",
              "date_day_week":"Fri",
              "date_month_name":"Oct",
              "date_month_day":"1",
              "date_hour":"17:01:48",
              "date_year":"2010",
              "date_hour_gmt":"+0700",
              "author_date_unix_timestamp":"1285927308",
              "date_iso_8601":"2010-10-01",
              "committer_email":"bogus@name.com",
              "files_changed":"0",
              "insertions":"",
              "deletions":"",
              "impact":"0"
          },
          {
              "repository":"apple",
              "commit_nr":"2",
              "commit_hash":"3d3d52f0197aa501c9c4d6e4c245604e696097e1",
              "commit_hash_abbreviated":"3d3d52f",
              "tree_hash":"a1e190dfc9e63c7895884fbc9c1cbfa1473a27c2",
              "tree_hash_abbreviated":"a1e190d",
              "parent_hashes":"61180570cb0cbc2233f841436d924ab43eeb7c7e",
              "parent_hashes_abbreviated":"6118057",
              "author_email":"bogus@name.com",
              "date_day_week":"Mon",
              "date_month_name":"Oct",
              "date_month_day":"11",
              "date_hour":"11:30:08",
              "date_year":"2010",
              "date_hour_gmt":"+0700",
              "author_date_unix_timestamp":"1286771408",
              "date_iso_8601":"2010-10-11",
              "committer_email":"bogus@name.com",
              "files_changed":"24",
              "insertions":"452",
              "deletions":"",
              "impact":"452"
          },
          {
              "repository":"apple",
              "commit_nr":"3",
              "commit_hash":"1b5b80db7dd8a252d40b6331ba7ba85dd4af90c6",
              "commit_hash_abbreviated":"1b5b80d",
              "tree_hash":"89d70a6ac4b071aea13055f91a9907c6480e99d3",
              "tree_hash_abbreviated":"89d70a6",
              "parent_hashes":"3d3d52f0197aa501c9c4d6e4c245604e696097e1",
              "parent_hashes_abbreviated":"3d3d52f",
              "author_email":"bogus@name.com",
              "date_day_week":"Mon",
              "date_month_name":"Oct",
              "date_month_day":"11",
              "date_hour":"14:17:47",
              "date_year":"2010",
              "date_hour_gmt":"+0700",
              "author_date_unix_timestamp":"1286781467",
              "date_iso_8601":"2010-10-11",
              "committer_email":"bogus@name.com",
              "files_changed":"1",
              "insertions":"15",
              "deletions":"",
              "impact":"15"
          },
          {
              "repository":"orange",
              "commit_nr":"1",
              "commit_hash":"dac34582a10de94cd305afc47cd888ee59c30e35",
              "commit_hash_abbreviated":"dac3458",
              "tree_hash":"9114b1b23157894f3fac49ecd7686aadc2cc7678",
              "tree_hash_abbreviated":"9114b1b",
              "parent_hashes":"",
              "parent_hashes_abbreviated":"",
              "author_email":"bogus@name.com",
              "date_day_week":"Tue",
              "date_month_name":"Feb",
              "date_month_day":"4",
              "date_hour":"01:24:51",
              "date_year":"2014",
              "date_hour_gmt":"-0800",
              "author_date_unix_timestamp":"1391505891",
              "date_iso_8601":"2014-02-04",
              "committer_email":"bogus@name.com",
              "files_changed":"1",
              "insertions":"4",
              "deletions":"",
              "impact":"4"
          },
          {
              "repository":"orange",
              "commit_nr":"2",
              "commit_hash":"077fa1e30bfb1b02241d8fd603941a250ded983d",
              "commit_hash_abbreviated":"077fa1e",
              "tree_hash":"d8eb6b28fd3798b0490fd7376c29781cdaffd42d",
              "tree_hash_abbreviated":"d8eb6b2",
              "parent_hashes":"dac34582a10de94cd305afc47cd888ee59c30e35",
              "parent_hashes_abbreviated":"dac3458",
              "author_email":"bogus@name.com",
              "date_day_week":"Wed",
              "date_month_name":"Feb",
              "date_month_day":"5",
              "date_hour":"20:24:48",
              "date_year":"2014",
              "date_hour_gmt":"+0700",
              "author_date_unix_timestamp":"1391606688",
              "date_iso_8601":"2014-02-05",
              "committer_email":"bogus@name.com",
              "files_changed":"9",
              "insertions":"374",
              "deletions":"",
              "impact":"374"
          },
          {
              "repository":"orange",
              "commit_nr":"3",
              "commit_hash":"e217e8d4b4e366331d5e2a196215867c60215bfc",
              "commit_hash_abbreviated":"e217e8d",
              "tree_hash":"95d4002df3db4d0f3912b0609a3680dd3d751a92",
              "tree_hash_abbreviated":"95d4002",
              "parent_hashes":"077fa1e30bfb1b02241d8fd603941a250ded983d",
              "parent_hashes_abbreviated":"077fa1e",
              "author_email":"bogus@name.com",
              "date_day_week":"Thu",
              "date_month_name":"Feb",
              "date_month_day":"6",
              "date_hour":"14:44:00",
              "date_year":"2014",
              "date_hour_gmt":"+0700",
              "author_date_unix_timestamp":"1391672640",
              "date_iso_8601":"2014-02-06",
              "committer_email":"bogus@name.com",
              "files_changed":"1",
              "insertions":"1",
              "deletions":"3",
              "impact":"-2"
          }
      ]
  }
  </code></pre>
  
  <p>Any help is appreciated!</p>