Этот вызов слишком долго ставил меня в тупик. Совершив концептуальный прорыв, вы почувствуете себя идиотом. Нам нужно создать функцию, которая просматривает массив объектов (первый аргумент) и возвращает массив всех объектов, имеющих совпадающие пары свойств и значений (второй аргумент).
Вы должны быть знакомы с тем, как выбирать элементы из массива.
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 });