Why does in THAT LINE BELOW the ‘obj’ is the objects { first: ‘Romeo’, last: ‘Montague’ } etc
I see this is iteration, but from where does JS get that?
And maybe anyone could suggest proper reading and explanation for this?
Artem.
function whatIsInAName(collection, source) {
const arr = [];
// Only change code below this line
const source_arr = Object.keys(source); // array of Source Keys
//const souceKeys = Object.keys(source);
//THIS LINE BELOW
return collection.filter(obj => {
for (let i = 0; i < source_arr.length; i++) {
console.log(obj) //checking obj here
if (!obj.hasOwnProperty(source_arr[i]) ||
obj[source_arr[i]] !== source[source_arr[i]]) {
return false;
}
}
return true;
});
// Only change code above this line
return arr;
}
whatIsInAName([{ first: "Romeo", last: "Montague" }, { first: "Mercutio", last: null }, { first: "Tybalt", last: "Capulet" }], { last: "Capulet" });
I’ve edited your post for readability. When you enter a code block into a forum post, please precede it with a separate line of three backticks and follow it with a separate line of three backticks to make it easier to read.
You can also use the “preformatted text” tool in the editor (</>) to add backticks around text.
collection is an array and filter is a method called on that array which returns a new array. The filter method takes a function as the first argument and then uses this function to determine which items in collection should be “filtered” into the new array it returns. So
obj => {...}
is a function definition using the arrow syntax. The function takes one parameter, which is obj in this case, but you can change that to whatever you want, you get to decide what to name that parameter. It makes sense to use obj here since collection is an array of objects.
The filter method will automatically go through each item in collection and pass it into the function you passed into filter. So each object in the collection array gets passed into your function through the obj parameter.
obj is just parameter, and with filter method JS uses {…} arrow function body to decide true-false, right? And for many parameters we have to use another syntax like const obj =() => {}, isn’t?
It is very confuses me every time.
The callback function for the filter method can actually take more than one parameter. The second parameter is the index number of the current array item. So if you wanted to use that then it would look like:
return collection.filter((obj, index) => {...})
Also, if it makes it easier to understand, you don’t have to use arrow functions. You could use the traditional function definition instead: