title: recursively filter complex object in javascript
body: <p>I've been racking my brain over this one for awhile and thought maybe it's time to post here.  </p>
  
  <p>I have a complex object structure that can have a nested item propery any level deep.  Here is an example:</p>
  
  <pre><code> {
      resourceType: 'QuestionnaireResponse',
      item: [
        {
          linkId: 'Floors',
          answer: []
        },
        {
          linkId: 'KID',
          answer: [
            {
              valueBoolean: false
            }
          ]
        },
        {
          linkId: 'Age',
          answer: [
            {
              valueString: '≥30 Years'
            }
          ]
        },
        {
          linkId: 'UnicornGroup',
          item: [
            {
              linkId: 'DoYouLikeUnicorns',
              answer: [{valueBoolean: true}]
            },
            {
              linkId: 'DoYouLikeFHIR'
            }
          ],
          answer: []
        }
      ]
    }
  </code></pre>
  
  <p>I want to end up with an object that looks like this: </p>
  
  <pre><code>{
      resourceType: 'QuestionnaireResponse',
      item: [
        {
          linkId: 'KID',
          answer: [
            {
              valueBoolean: false
            }
          ]
        },
        {
          linkId: 'Age',
          answer: [
            {
              valueString: '≥30 Years'
            }
          ]
        },
        {
          linkId: 'UnicornGroup',
          item: [
            {
              linkId: 'DoYouLikeUnicorns',
              answer: [{valueBoolean: true}]
            }
          ]
        }
      ]
    }
  </code></pre>
  
  <p>That is I want to filter out item objects that have an empty answer array and don't have a nested object that has a non empty answer array.  </p>
  
  <p>This is what I have but it's not working:</p>
  
  <pre><code>var res = fItems.filter(function f(o) {
    if (o.answer &amp;&amp; o.answer.length &gt; 0) { 
      return true 
    } else {
      if(o.item){
        return f(o.item); 
      }
    }
  });
  </code></pre>
  
  <p>I created a REPL <a href="https://ramdajs.com/repl/#?const%20mq%20%3D%0A%20%20%7B%0A%20%20%20%20resourceType%3A%20%27QuestionnaireResponse%27%2C%0A%20%20%20%20item%3A%20%5B%0A%20%20%20%20%20%20%7B%0A%20%20%20%20%20%20%20%20linkId%3A%20%27Floors%27%2C%0A%20%20%20%20%20%20%20%20answer%3A%20%5B%5D%0A%20%20%20%20%20%20%7D%2C%0A%20%20%20%20%20%20%7B%0A%20%20%20%20%20%20%20%20linkId%3A%20%27KID%27%2C%0A%20%20%20%20%20%20%20%20answer%3A%20%5B%0A%20%20%20%20%20%20%20%20%20%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20valueBoolean%3A%20false%0A%20%20%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%20%20%5D%0A%20%20%20%20%20%20%7D%2C%0A%20%20%20%20%20%20%7B%0A%20%20%20%20%20%20%20%20linkId%3A%20%27Age%27%2C%0A%20%20%20%20%20%20%20%20answer%3A%20%5B%0A%20%20%20%20%20%20%20%20%20%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20valueString%3A%20%27%E2%89%A530%20Years%27%0A%20%20%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%20%20%5D%0A%20%20%20%20%20%20%7D%2C%0A%20%20%20%20%20%20%7B%0A%20%20%20%20%20%20%20%20linkId%3A%20%27UnicornGroup%27%2C%0A%20%20%20%20%20%20%20%20item%3A%20%5B%0A%20%20%20%20%20%20%20%20%20%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20linkId%3A%20%27DoYouLikeUnicorns%27%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20answer%3A%20%5B%7BvalueBoolean%3A%20true%7D%5D%0A%20%20%20%20%20%20%20%20%20%20%7D%2C%0A%20%20%20%20%20%20%20%20%20%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20linkId%3A%20%27DoYouLikeFHIR%27%0A%20%20%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%20%20%5D%2C%0A%20%20%20%20%20%20%20%20answer%3A%20%5B%5D%0A%20%20%20%20%20%20%7D%0A%20%20%20%20%5D%0A%20%20%7D%0A%0A%0A%0Alet%20fItems%20%3D%20mq.item%3B%0Aconsole.log%28%27before%20filtering%20%27%2C%20fItems%29%3B%0A%0Avar%20res%20%3D%20fItems.filter%28function%20f%28o%29%20%7B%0A%20%20if%20%28o.answer%20%26%26%20o.answer.length%20%3E%200%29%20%7B%20%0A%20%20%20%20return%20true%20%0A%20%20%7D%20else%20%7B%0A%20%20%20%20if%28o.item%29%7B%0A%20%20%20%20%20%20return%20f%28o.item%29%3B%20%0A%20%20%20%20%7D%0A%20%20%7D%0A%7D%29%3B%0A%0Aconsole.log%28%27after%20filtering%20%27%2C%20res%29%3B%0A%0A%0A%0A" rel="nofollow noreferrer">Here</a>.  We're using ramda in our project so if the solution uses ramda thats fine too.  Thanks for the time.</p>