Как сделать так, чтобы select принимал в функции query() в переменной result результат функции filterIn() и фильтровал по своим аргументам 'name', 'gender', 'email'. Не пойму как передать в select() эти аргументы 'name', 'gender', 'email'.
var friends = [
{
name: 'Сэм',
gender: 'Мужской',
email: 'luisazamora@example.com',
favoriteFruit: 'Картофель'
},
{
name: 'Эмили',
gender: 'Женский',
email: 'example@example.com',
favoriteFruit: 'Яблоко'
},
{
name: 'Мэт',
gender: 'Мужской',
email: 'danamcgee@example.com',
favoriteFruit: 'Яблоко'
},
{
name: 'Брэд',
gender: 'Мужской',
email: 'newtonwilliams@example.com',
favoriteFruit: 'Банан'
}
];
function query(collection) {
var result = select(arguments[2]);
return result;
};
function select() {
var selectArr = arguments[0];
for (var i = 0; i < friends.length; i++) {
for (var key in friends[i]) {
if (selectArr.indexOf.call(arguments, key) == -1) {
delete selectArr[i][key];
}
}
}
return selectArr
};
function filterIn(property, values) {
var arr = [];
for (var q = 0; q < friends.length; q++) {
for (var i = 0; i < values.length; i++) {
if (friends[q].hasOwnProperty(property)) {
if (friends[q][property] == values[i]) {
arr.push(friends[q])
}
}
}
}
return arr
};
var lib = query(friends, select('name', 'gender', 'email'), filterIn('favoriteFruit', ['Яблоко', 'Картофель']));
console.log(lib)
Результат вывести должен такой.
[
{ name: 'Сэм', gender: 'Мужской', email: 'luisazamora@example.com' },
{ name: 'Эмили', gender: 'Женский', email: 'example@example.com' },
{ name: 'Мэт', gender: 'Мужской', email: 'danamcgee@example.com' },
{ name: 'Шерри', gender: 'Женский', email: 'danamcgee@example.com' },
{ name: 'Стелла', gender: 'Женский', email: 'waltersguzman@example.com' }
]
Судя по описанию и примеру вызова функция query должна принимать три параметра, а не один, как сейчас. И в общем виде ее можно записать так:
function query(collection, selectFunc, filterFunc){
return collection.filter(filterFunc).map(selectFunc);
}
Для этой функции осталось получить нужные функции.
Пускай filterIn будет возвращать функцию, принимающую объект, и возвращающую true если объект удовлетворяет условию и false в противном случае.
Условие можно писать так: указанное поле, должно иметь одно из перечисленных значений.
Тогда filterIn может принять следующий вид:
function filterIn(field, allowedValues){
return function filterFunc(element) {
return allowedValues.includes(element[field]);
};
}
Теперь к функции select, по переданным полям нужно собрать объект включающий только эти поля. Реализовать это можно с помощью reduce
function select(...fields){
return function selectFunc(element) {
return fields.reduce((acc,fieldName)=>{
acc[fieldName] = element[fieldName];
return acc;
},{});
};
}
Пример в сборе:
var friends = [{
name: 'Сэм',
gender: 'Мужской',
email: 'luisazamora@example.com',
favoriteFruit: 'Картофель'
},
{
name: 'Эмили',
gender: 'Женский',
email: 'example@example.com',
favoriteFruit: 'Яблоко'
},
{
name: 'Мэт',
gender: 'Мужской',
email: 'danamcgee@example.com',
favoriteFruit: 'Яблоко'
},
{
name: 'Брэд',
gender: 'Мужской',
email: 'newtonwilliams@example.com',
favoriteFruit: 'Банан'
}
];
function query(collection, selectFunc, filterFunc) {
return collection.filter(filterFunc).map(selectFunc);
}
function filterIn(field, allowedValues) {
return function filterFunc(element) {
return allowedValues.includes(element[field]);
};
}
function select(...fields) {
return function selectFunc(element) {
return fields.reduce((acc, fieldName) => {
acc[fieldName] = element[fieldName];
return acc;
}, {});
};
}
var lib = query(friends, select('name', 'gender', 'email'), filterIn('favoriteFruit', ['Яблоко', 'Картофель']));
console.log(lib)
Как развивать веб-проекты в 2026 году: технологии, контент E-E-A-T и факторы доверия
Современные инструменты для криптотрейдинга: как технологии помогают принимать решения
Апостиль в Лос-Анджелесе без лишних нервов и бумажной волокиты
Основные этапы разработки сайта для стоматологической клиники