Not really sure why it will pass the first two tests and then return and empty array on the 3rd test. I know just by looking at some of the other solutions there are more elegant ways of doing this but by following the logic I wrote, I cannot understand what the difference in outcome was between the second test (which also returns more than one object) and the third test.

You have the right idea, but the problem here is that hasOwnProperty needs to take just a string. When you pass an array of strings, it will concatenate all of them into one. So, the first two tests pass because the source parameter is an object with just one key. For example, the first test is whatIsInAName([{ first: "Romeo", last: "Montague" }, { first: "Mercutio", last: null }, { first: "Tybalt", last: "Capulet" }], { last: "Capulet" }). source is the object { last: "Capulet" }. Calling Object.keys on it returns ["last"]. When passed to hasOwnProperty, it automatically gets converted to a string, “last”. That’s (accidentally) what you want, and so the test passes. You can follow this logic to see that it works for the second test as well.

The third and fourth tests are being passed objects with more than one key. { "a": 1, "b": 2 } is what’s passed in the third test.