Рекурсивная функция Javascript не работает для упорядочивания данных - PullRequest
0 голосов
/ 19 декабря 2018

Когда я запускаю этот код, по какой-то причине я считаю, что метод рекурсивного упорядочения не делает правильных действий.Ни одна из внутренних группировок не присутствует в выходных данных для функции фильтра.Что я делаю не так с функциональным JavaScript?

const def = x => typeof x !== 'undefined'

const filter = ([x, ...xs], fn) => def(x)
    ? fn(x)
        ? [x, ...filter(xs, fn)] : [...filter(xs, fn)]
    : []    

let arrange = t => {
  return { num: t.id, groups: t.groups.map(arrange) }
}

let data = [
  {id: 1, groups: [{id: 3, groups: []}]},
  {id: 4, groups: []},
  {id: 5, groups: []}
]
   
let groups = data.map(arrange)

console.log(groups)
// => [ { num: 1, groups: [ [Object] ] },
//      { num: 4, groups: [] },
//      { num: 5, groups: [] } ]

let getById = g => {
    if (g.num === 3) {
      return true
    } else {
      return false
    }
}

let filtered = filter(groups, getById)

console.log(filtered)
// []

1 Ответ

0 голосов
/ 19 декабря 2018

Перед фильтрацией необходимо сгруппировать вложенные записи в плоский список:

 const flatten = groups => groups.flatMap(group => [group, ...flatten(group.groups)]);

Таким образом, вы можете легко сделать это:

 const result = filter(flatten(groups), byID);

, чтобы получить массив групп.


Чтобы сохранить древовидный порядок, вы должны были бы рекурсивно фильтровать:

const advancedFilter = predicate => array => array.map(predicate).filter(it => it.take).map(it => it.value || it);

const use = (a, v) => v(a);

const filterGroups = predicate => advancedFilter(group => use(
  filterGroups(predicate)(group.groups), 
  filtered => ({ take: predicate(group) || !!filtered.length, value: { ...group, groups: filtered })
));

const result = filterGroups(byID)(groups);

Обратите внимание, что flatMap очень нов, поэтому вы можете не использоватьэто в производстве без транспортера ...

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...