title: Deep Flatten JavaScript Object Recursively
body: <p><strong>Data</strong>:</p>
  
  <pre><code>var data = [
      {
        "id": 1,
        "level": "1",
        "text": "Sammy",
        "type": "Item",
        "items": [
          {
            "id": 11,
            "level": "2",
            "text": "Table",
            "type": "Item",
            "items": [
              {
                "id": 111,
                "level": "3",
                "text": "Dog",
                "type": "Item",
                "items": null
              },
              {
                "id": 112,
                "level": "3",
                "text": "Cat",
                "type": "Item",
                "items": null
              }
            ]
          },
          {
            "id": 12,
            "level": "2",
            "text": "Chair",
            "type": "Item",
            "items": [
              {
                "id": 121,
                "level": "3",
                "text": "Dog",
                "type": "Item",
                "items": null
              },
              {
                "id": 122,
                "level": "3",
                "text": "Cat",
                "type": "Item",
                "items": null
              }
            ]
          }
        ]
      },
      {
        "id": 2,
        "level": "1",
        "text": "Sundy",
        "type": "Item",
        "items": [
          {
            "id": 21,
            "level": "2",
            "text": "MTable",
            "type": "Item",
            "items": [
              {
                "id": 211,
                "level": "3",
                "text": "MTDog",
                "type": "Item",
                "items": null
              },
              {
                "id": 212,
                "level": "3",
                "text": "MTCat",
                "type": "Item",
                "items": null
              }
            ]
          },
          {
            "id": 22,
            "level": "2",
            "text": "MChair",
            "type": "Item",
            "items": [
              {
                "id": 221,
                "level": "3",
                "text": "MCDog",
                "type": "Item",
                "items": null
              },
              {
                "id": 222,
                "level": "3",
                "text": "MCCat",
                "type": "Item",
                "items": null
              }
            ]
          }
        ]
      },
      {
        "id": 3,
        "level": "1",
        "text": "Bruce",
        "type": "Folder",
        "items": [
          {
            "id": 31,
            "level": "2",
            "text": "BTable",
            "type": "Item",
            "items": [
              {
                "id": 311,
                "level": "3",
                "text": "BTDog",
                "type": "Item",
                "items": null
              },
              {
                "id": 312,
                "level": "3",
                "text": "BTCat",
                "type": "Item",
                "items": null
              }
            ]
          },
          {
            "id": 32,
            "level": "2",
            "text": "Chair",
            "type": "Item",
            "items": [
              {
                "id": 321,
                "level": "3",
                "text": "BCDog",
                "type": "Item",
                "items": null
              },
              {
                "id": 322,
                "level": "3",
                "text": "BCCat",
                "type": "Item",
                "items": null
              }
            ]
          }
        ]
      }
    ];
  </code></pre>
  
  <p><strong>Code</strong>:</p>
  
  <pre><code>var fdr = [];
  var fd = function(n) {
    if (n.items) {
      _.forEach(n.items, function (value){
        fd(value);
      });
    }
  
    fdr.push(n);
  };
  _.forEach(data, fd);
  console.log(fdr);
  </code></pre>
  
  <p><strong>Desired output</strong>:</p>
  
  <pre><code>var data = [
      {
        "id": 1,
        "level": "1",
        "text": "Sammy",
        "type": "Item",
        "items": []
      },
      {
        "id": 11,
        "level": "2",
        "text": "Table",
        "type": "Item",
        "items": []
      },
      {
        "id": 111,
        "level": "3",
        "text": "Dog",
        "type": "Item",
        "items": null
      },
      {
        "id": 112,
        "level": "3",
        "text": "Cat",
        "type": "Item",
        "items": null
      },
      {
        "id": 12,
        "level": "2",
        "text": "Chair",
        "type": "Item",
        "items": []
      },
      {
        "id": 121,
        "level": "3",
        "text": "Dog",
        "type": "Item",
        "items": null
      },
      {
        "id": 122,
        "level": "3",
        "text": "Cat",
        "type": "Item",
        "items": null
      },
      {
        "id": 2,
        "level": "1",
        "text": "Sundy",
        "type": "Item",
        "items": []
      },
      {
        "id": 21,
        "level": "2",
        "text": "MTable",
        "type": "Item",
        "items": []
      },
      {
        "id": 211,
        "level": "3",
        "text": "MTDog",
        "type": "Item",
        "items": null
      },
      {
        "id": 212,
        "level": "3",
        "text": "MTCat",
        "type": "Item",
        "items": null
      },
      {
        "id": 22,
        "level": "2",
        "text": "MChair",
        "type": "Item",
        "items": []
      },
      {
        "id": 221,
        "level": "3",
        "text": "MCDog",
        "type": "Item",
        "items": null
      },
      {
        "id": 222,
        "level": "3",
        "text": "MCCat",
        "type": "Item",
        "items": null
      },
      {
        "id": 3,
        "level": "1",
        "text": "Bruce",
        "type": "Folder",
        "items": []
      },
      {
        "id": 31,
        "level": "2",
        "text": "BTable",
        "type": "Item",
        "items": []
      },
      {
        "id": 311,
        "level": "3",
        "text": "BTDog",
        "type": "Item",
        "items": null
      },
      {
        "id": 312,
        "level": "3",
        "text": "BTCat",
        "type": "Item",
        "items": null
      },
      {
        "id": 32,
        "level": "2",
        "text": "Chair",
        "type": "Item",
        "items": []
      },
      {
        "id": 321,
        "level": "3",
        "text": "BCDog",
        "type": "Item",
        "items": null
      },
      {
        "id": 322,
        "level": "3",
        "text": "BCCat",
        "type": "Item",
        "items": null
      }
    ];
  </code></pre>
  
  <p><strong>Conditions</strong>:</p>
  
  <ul>
  <li>Object have unknowns level. Some child <code>item</code> may have one level down and some could have up to 5.</li>
  </ul>
  
  <p><strong>Questions</strong></p>
  
  <p>The <code>fd</code> function in the code is what I have come up with. I believe there's a 'cleaner' way to do this, just can't think of something. Plus, the function return <code>items</code> object, render it circular object.</p>
  
  <p>JsBin:
  <a href="http://jsbin.com/debojiqove/2/edit?html,js,output">http://jsbin.com/debojiqove/2/edit?html,js,output</a></p>
  
  <p>Is there a way to flatten object recursively with lodash or just plain JavaScript?.</p>