Как сделать так, чтобы 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)
Кофе для программистов: как напиток влияет на продуктивность кодеров?
Рекламные вывески: как привлечь внимание и увеличить продажи
Стратегії та тренди в SMM - Технології, що формують майбутнє сьогодні
Выделенный сервер, что это, для чего нужен и какие характеристики важны?
Современные решения для бизнеса: как облачные и виртуальные технологии меняют рынок
Мне нужно создать массив классаtab_p, потом получить каждого из них высоту и назначить всем элементам данного класса наибольшую высоту
ECMAScript определяет 2 типа работ как обязательные: Promise Jobs и Script JobsСитуация с Promise Jobs понятна: создал себе Promise или асинхронную функцию - и все,...