Уважаемые StackOverflowers…
У меня есть набор постов:
const posts = [
{ title: 'post1', tags: ['all', 'half', 'third', 'quarter', 'sixth']},
{ title: 'post2', tags: ['all', 'half', 'third', 'quarter', 'sixth']},
{ title: 'post3', tags: ['all', 'half', 'third', 'quarter']},
{ title: 'post4', tags: ['all', 'half', 'third']},
{ title: 'post5', tags: ['all', 'half']},
{ title: 'post6', tags: ['all', 'half']},
{ title: 'post7', tags: ['all']},
{ title: 'post8', tags: ['all']},
{ title: 'post9', tags: ['all']},
{ title: 'post10', tags: ['all']},
{ title: 'post11', tags: ['all']},
{ title: 'post12', tags: ['all']}
];
И постоянно увеличивающийся набор полезных функций:
const map = f => list => list.map(f);
const filter = f => list => list.filter(f);
const reduce = f => y => xs => xs.reduce((y,x)=> f(y)(x), y);
const pipe = (fn,...fns) => (...args) => fns.reduce( (acc, f) => f(acc), fn(...args));
const comp = (...fns) => pipe(...fns.reverse()); // const comp = (f, g) => x => f(g(x));
const prop = prop => obj => obj[prop];
const propEq = v => p => obj => prop(p)(obj) === v;
const flatten = reduce(y=> x=> y.concat(Array.isArray(x) ? flatten (x) : x)) ([]);
const unique = list => list.filter((v, i, a) => a.indexOf(v) === i);
const add = a => b => a + b;
const addO = a => b => Object.assign(a, b);
const log = x => console.log(x);
И я хотел бы массировать данные в формате:
[
{ title: 'sixth', posts: [array of post objects that all have tag 'sixth'] },
{ title: 'quarter', posts: [array of post objects that all have tag 'quarter'] },
{ title: 'third', posts: [array of post objects that all have tag ’third'] },
etc...
]
Используя бесточечный стиль, используя только повторно используемые компактные служебные функции.
Я могу получить уникальные теги из всех сообщений:
const tagsFor = comp(
unique,
flatten,
map(prop('tags'))
);
tagsFor(posts);
И я могу решить, как добиться того, чего я хочу, используя карту и фильтр:
tagsFor(posts).map(function(tag) {
return {
title: tag,
posts: posts.filter(function(post) {
return post.tags.some(t => t === tag);
});
};
});
Я просто не могу понять, как достичь этого молчаливым образом.
Любые указатели будут с благодарностью получены...
f => x = f(x)(x)
. Вместе с композицией функций и функциейflip
вы можете использовать ее для создания параллельных потоков данных, например, она вам понадобится дляtag
(которая используется как дляtitle
, так и дляposts
). Или используйте более конкретный комбинатор функций, который выполняет нужную вам работу, иначе он станет действительно странным и непригодным для использования. - person Bergi   schedule 03.10.2016f => x => f(x)(x)
? Потратив день на обработку и настройку ввода @Naomik, я думаю, что «параллельные потоки данных — это то, к чему мне нужно стремиться. обновлю вопрос... - person Adam   schedule 04.10.2016join
из Function Monad. Например, сbind = f => k => x => k(f(x))(x)
, но я не уверен, что общая терминология сильно поможет в этом конкретном случае использования. Вы также можете ознакомиться с более общим Стрелки с их более подходящим разветвлением, разветвлением, разветвлением. - person Bergi   schedule 04.10.2016