Как добавить аргументы в функцию

260
16 января 2018, 14:32

Как сделать так, чтобы 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' }
]
Answer 1

Судя по описанию и примеру вызова функция 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)

READ ALSO
Как создать массив DOM елементов?

Как создать массив DOM елементов?

Мне нужно создать массив классаtab_p, потом получить каждого из них высоту и назначить всем элементам данного класса наибольшую высоту

246
Не срабатывает счетчик score

Не срабатывает счетчик score

Не срабатывает счетчик scoreТ

239
ECMAScript Script Jobs. Как инициировать работу этого типа?

ECMAScript Script Jobs. Как инициировать работу этого типа?

ECMAScript определяет 2 типа работ как обязательные: Promise Jobs и Script JobsСитуация с Promise Jobs понятна: создал себе Promise или асинхронную функцию - и все,...

146
Node.js node-config vs defer()

Node.js node-config vs defer()

День добрый, помогите разобраться:

158