Передача функции с аргументами в качестве функции [дубликат]

291
02 марта 2018, 19:23

Данный вопрос уже был задан и имеет решение:

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

Как передать функцию с аргументами в качестве аргумента (см. переменную result), причем так, чтобы сначала вызвалась функция query, затем функция filterIn, а затем select и в итоге результат вернулся в виде массива объектов (коллекции)?

Ведь если сейчас просто запустить, то вызовется сначала select, потом filterIn и уже потом query

var lib = {
    query: query,
    select: select,
    filterIn: filterIn
};
function query(collection) {
    //Сюда получаем
}
function select() {
    //Код для выборки только нужных ключей коллекции
}
function filterIn(property, values) {
    //Код для фильтрации коллекции
}
var people = [
    {
        name: 'Андрей',
        gender: 'Мужской',
        email: 'andrey@site.ru',
    },
    {
        name: 'Николай',
        gender: 'Мужской',
        email: 'halo@site.ru',
    }
]
var result = lib.query(
    people,
    lib.select('name', 'gender'),
    lib.filterIn('name', ['Андрей', 'Николай'])
);

Причем реализацию переменной result и коллекции редактировать нельзя, все остальное можно.

Answer 1

Речь не о запуске функци (его изменить невозможно), а о порядке применения операций к массиву. Функции select и filterIn должны возвращать другие функции, которые и будут в нужном порядке вызываться в query:

var lib = { 
    query: query, 
    select: select, 
    filterIn: filterIn 
}; 
 
function query(arr, ...fs) { 
    console.log('query'); 
 
    for (var q=fs.length; q--; ) { 
      arr = fs[q](arr) 
    } 
     
    return arr; 
} 
 
function select(...fields) { 
    return function (arr) { 
        console.log('select'); 
         
        return arr.map(x => { 
          var res = {}; 
          for (var f of fields) res[f] = x[f]; 
          return res; 
        }); 
    } 
} 
 
function filterIn(property, values) { 
    return function (arr) { 
        console.log('filterIn'); 
         
        return arr.filter(x => ~values.indexOf(x[property])); 
    } 
} 
 
var people = [ 
    { 
        name: 'Андрей', 
        gender: 'Мужской', 
        email: 'andrey@site.ru', 
    }, 
    { 
        name: 'Николай', 
        gender: 'Мужской', 
        email: 'halo@site.ru', 
    } 
] 
 
var result = lib.query( 
    people, 
    lib.select('name', 'gender'), 
    lib.filterIn('name', ['Андрей', 'Николай']) 
); 
 
console.log(result);
.as-console-wrapper.as-console-wrapper { max-height: 100vh }

Answer 2

Возвращаемые данные из одной функции надо передавать в другую, и так по цепочке.

select(filter(query(queryArgs), filterArgs), selectArgs);

READ ALSO
Обновление данных без перезагрузки jinja2

Обновление данных без перезагрузки jinja2

Нужно добиться того, чтобы данные на странице обновлялись без перезагрузки страницыПервоначально данные поступают от сервера и отображаются...

206
javascript google spreadsheets

javascript google spreadsheets

Добрый деньЗадача следующая: - Есть источник данных в гугл таблице с содержанием городов и информации по ним (города в колонке B:B, формула...

240