Этот вызов слишком долго ставил меня в тупик. Совершив концептуальный прорыв, вы почувствуете себя идиотом. Нам нужно создать функцию, которая просматривает массив объектов (первый аргумент) и возвращает массив всех объектов, имеющих совпадающие пары свойств и значений (второй аргумент).

Вы должны быть знакомы с тем, как выбирать элементы из массива.

var arr = [[1], [2]]
console.log(arr[0])
//logs [1]
console.log(arr[1])
//logs [2]

и поймите, что таким же образом можно выбирать элементы из подмассивов.

var arr = [[1,4,3], [1,2,3]]
console.log(arr[0][1])
//logs 4

Ключ к решению этой проблемы - понимание того, что делает Object.keys(). Литерал объекта в массиве collection заменил числовую клавишу на слова, поэтому вы больше не можете выбирать элементы в массиве с помощью числовой клавиши, как вы привыкли.

function whatIsInAName(collection, source) {
 
 console.log(collection[1][0])
 // logs undefined
 
}
whatIsInAName([{ first: “Romeo”, last: “Montague” }, { first: “Mercutio”, last: null }, { first: “Tybalt”, last: “Capulet” }], { last: “Capulet” });

Однако, если вы используете клавишу для выбора «первого» значения, это сработает:

function whatIsInAName(collection, source) {
 
 console.log(collection[1].first)
 console.log(collection[1][“first”])
 // Both log Mercutio
 
}
whatIsInAName([{ first: “Romeo”, last: “Montague” }, { first: “Mercutio”, last: null }, { first: “Tybalt”, last: “Capulet” }], { last: “Capulet” });

Итак, вы должны увидеть, что нам нужно взять значение ключа из source с помощью Object.keys(source)

function whatIsInAName(collection, source) {
 
 var key = Object.keys(source);
 console.log(key)
 //logs [‘last’]
}
whatIsInAName([{ first: “Romeo”, last: “Montague” }, { first: “Mercutio”, last: null }, { first: “Tybalt”, last: “Capulet” }], { last: “Capulet” });

Затем нам нужно пройти через collection, чтобы проверить, содержит ли какое-либо из свойств значение, которое соответствует значению source. Нам также нужно делать это по одному, и для всех ключей, содержащихся вsource , мы хотим написать функцию, которая использует фильтр, чтобы определять, будет ли элемент collection удаляться или нет. Если массив завершается, мы хотим вернуть истину. Если не ложь.

function whatIsInAName(collection, source) {
var arr =[];
var result =undefined;
var keys = Object.keys(source);
console.log(keys.length);
function check(item){
 
 for (var i = 0; i < keys.length; i++){
 
 if (item.hasOwnProperty(keys[i]) && item[keys[i]] == source[keys[i]]){
 result = true;
 }
 else result = false;
 }
 return result;
}
arr = collection.filter(check);
return arr;
 
 
 // Only change code above this line
}
whatIsInAName([{ “a”: 1, “b”: 2 }, { “a”: 1 }, { “a”: 1, “b”: 2, “c”: 2 }], { “a”: 1, “b”: 2 });