Уважаемые 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);
});
};
});
Я просто не могу похоже, неловко оглядывается.
Все указатели будут с благодарностью приняты ...
Просто абстрагируйте их в сторону дополнительной функции полезности, и если они не кажутся достаточно обобщенными, отвлечь их дальше. Добавляя к уже установленному набору, вам, по крайней мере, понадобится функция равенства, функция создания объекта и функция удвоения параметра. – Bergi
@Bergi спасибо за ваш вклад. Что такое функция удвоения параметра? – Adam
Что-то вроде 'f => x = f (x) (x)'. Вместе с композицией функций и функцией «флип» вы можете использовать ее для создания «параллельных» потоков данных, например, вам понадобится «tag» (это используется как «title» и «posts»). Или используйте более конкретный комбинатор функций, который выполняет нужную вам работу, в противном случае он становится действительно странным и непригодным для использования. – Bergi