Третий день программы
Сегодня будет задание с объектами и массивами
Wherefore art thou
Задание звучит так:
Сделайте функцию, которая просматривает массив объектов (первый аргумент) и возвращает массив всех объектов, которые имеют соответствующие свойства и пары значений (второй аргумент). Каждое свойство и значение пара исходного объекта должен присутствовать в объекте из коллекции,и если так, то он должен быть включен в возвращаемый массив.
Заданное начало кода выглядит так:
function whatIsInAName(collection, source) {
// What's in a name?
var arr = [];
// Only change code below this line
// Only change code above this line
return arr;
}
whatIsInAName([{ first: "Romeo", last: "Montague" }, { first: "Mercutio", last: null }, { first: "Tybalt", last: "Capulet" }], { last: "Capulet" });
Для решения этой задачи мы воспользуемся методами:
Очень неплохо вспомнить методы перебирающие массивы можно здесь -learn.javascript.ru, на русском языке.
Я решил эту задачу так:
function whatIsInAName(collection, source) { // What's in a name? var prop = Object.keys(source); // Only change code below this line return collection.filter(function (smb) { for(var i = 0; i < prop.length; i++) { if(!smb.hasOwnProperty(prop[i]) || smb[prop[i]] !== source[prop[i]]) { return false; } } return true; }); // Only change code above this line } whatIsInAName([{ first: "Romeo", last: "Montague" }, { first: "Mercutio", last: null }, { first: "Tybalt", last: "Capulet" }], { last: "Capulet" });
Более подробно стоит рассмотреть каждый метод.
Логика решения здесь следующая:
Для того, чтобы нам в массиве collection искать свойства объекта source нам нужно знать эти самые свойства. Потому что это может быть first, или а, или ещё какое - либо значение.
Для этого мы воспользуемся методом Object.keys(obj).
Как следует из описания:
Метод Object.keys возвращает массив строковых элементов, соответствующих именам перечисляемых свойств, найденных непосредственно в самом объекте. Порядок свойств такой же, как и при ручном перечислении свойств в объекте через цикл.
Пример:
var obj = { 0: 'a', 1: 'b', 2: 'c' };
console.log(Object.keys(obj)); // консоль: ['0', '1', '2']
В нашем случае alert вернет - last
var source = { last: "Capulet" };
// last
var prop = Object.keys(source);
alert(prop);
Теперь у нас есть свойство last которое мы поместили в переменную var prop
Это позволяет нам теперь найти такое свойство в массиве collection
. Для этого нам стоит воспользоваться методом Array.prototype.filter()
Этот метод выбран потому, что он позволяет провести проверку массива с поиском заданного свойства. А так же, метод filter() создаёт новый массив со всеми элементами, прошедшими проверку, задаваемую в передаваемой функции.
Синтаксис метода:
arr.filter(callback[, thisArg])
Здесь:
callback
- Функция проверки каждого элемента. Вызывается с аргументами (element, index, array). Возвращает true для сохранения элемента и false для его пропуска.
thisArg
- Необязательный параметр. Значение, используемое в качестве this при выполнении функции callback.
Описание:
Метод filter() вызывает переданную функцию callback один раз для каждого элемента, присутствующего в массиве, и конструирует новый массив со всеми значениями, для которых функция callback вернула true или значение, становящееся true при приведении в boolean. Функция callback вызывается только для индексов массива, имеющих присвоенные значения; она не вызывается для индексов, которые были удалены или которым значения никогда не присваивались. Элементы массива, не прошедшие проверку функцией callback, просто пропускаются и не включаются в новый массив.
Теперь мы применим этот метод к нашему массиву colection
и в качестве аргумента зададим уже знакомую функцию перебора массива for. For будет перебирать свойства, полученные от source и искать через метод фильтр формировать новый массив, если такие свойства будут найдены.
Выглядит это так:
function whatIsInAName(collection, source) {
var prop = Object.keys(source);
return collection.filter(function (smb) {
for(var i = 0; i < prop.length; i++) {
if(!smb.hasOwnProperty(prop[i]) || smb[prop[i]] !== source[prop[i]]) {
return false;
}
}
return true;
});
Теперь стоит остановиться на строке с if
Здесь мы отсеиваем те объекты массива, которые не имеют данного свойства
Остается более подробно остановиться на Методе hasOwnProperty().Он возвращает логическое значение, указывающее, содержит ли объект указанное свойство. То есть, если свойство есть, то true. Мы в первой строке идем от обратного добавляя НЕ = (!)
То есть - теперь мы получили функцию, которая вернет нам только те объекты, в которых обнаружит данные свойства.
Примеры того, что вернет функция:
return [{ first: "Tybalt", last: "Capulet" }].
whatIsInAName([{ "a": 1 }, { "a": 1 }, { "a": 1, "b": 2 }], { "a": 1 })
return [{ "a": 1 }, { "a": 1 }, { "a": 1, "b": 2 }].
whatIsInAName([{ "a": 1, "b": 2 }, { "a": 1 }, { "a": 1, "b": 2, "c": 2 }], { "a": 1, "b": 2 })
return [{ "a": 1, "b": 2 }, { "a": 1, "b": 2, "c": 2 }].
whatIsInAName([{ "a": 1, "b": 2 }, { "a": 1 }, { "a": 1, "b": 2, "c": 2 }], { "a": 1, "c": 2 })
return [{ "a": 1, "b": 2, "c": 2 }].
Комментариев нет:
Отправить комментарий