Сопоставить отфильтрованный массив с новым массивом только с подмножеством атрибутов - PullRequest
0 голосов
/ 04 октября 2018

Как мне сопоставить значения этого фильтра с новым массивом.Мой фильтр работает нормально, но мой конечный результат должен иметь свойство из массива im filter on.Я использую ramda.

let bugs = bugsfromBugzilla();
let users = utils.ReadJsonFile('./team.json');
      let data = R.filter(bug => {
        return R.any(filter => {
          return R.contains(filter.assignee, bug.assigned_to);
        }, users);
      }, bugs);

массив пользователей выглядит так:

[
  {
    "assignee": "jesse@email.com",
    "id": 843568062370470
  },
  {
    "assignee": "Ryan@email.com",
    "id": 848490202942168
  }
]

Мне нужен идентификатор, чтобы быть частью переменной данных. Также было бы неплохо, если бы я могтолько сопоставьте, какие атрибуты я хочу в новом массиве.

1 Ответ

0 голосов
/ 12 октября 2018

До сих пор не совсем ясно, что здесь нужно, без примеров входных или выходных данных.(Хорошо, у нас есть примеры пользователей, но нет примеров ошибок.)

Использование pipe

Тем не менее, я думаю, что это может быть близко:

const {contains, pipe, filter, any, project, map, assoc, prop, find} = R

const checkMatch = bug => user => contains(user.assignee, bug.assigned_to)

const extract = (users) => pipe(
  filter(bug => any(checkMatch(bug), users)),
  project(['bug_id', 'assigned_to', 'bar']),
  map(bug => assoc('user_id', prop('id', find(checkMatch(bug), users)), bug)),
)

const bugs = [
  {bug_id: 'abc', assigned_to: "jesse@email.com",           foo: 1, bar: 42, baz: 'z'},
  {bug_id: 'def', assigned_to: "fred@flintstone.com",       foo: 2, bar: 43, baz: 'y'},
  {bug_id: 'ghi', assigned_to: "jesse@email.com",           foo: 3, bar: 44, baz: 'x'},
  {bug_id: 'jkl', assigned_to: "Ryan@email.com",            foo: 4, bar: 45, baz: 'w'},
  {bug_id: 'mno', assigned_to: "Mr. Ryan <Ryan@email.com>", foo: 5, bar: 46, baz: 'v'},
  {bug_id: 'pqr', assigned_to: "wilma@flintstone.com",      foo: 6, bar: 47, baz: 'u'}
]
const users = [
  {"assignee": "jesse@email.com", "id": 843568062370470},
  {"assignee": "Ryan@email.com", "id": 848490202942168}
]

console.log(extract(users)(bugs))
<script src="//cdnjs.cloudflare.com/ajax/libs/ramda/0.25.0/ramda.js"></script>

Обратите внимание, что из-за задержки между вопросом / ответом на комментарии я догадываюсь, зачем вам нужен contains здесь.Я предполагаю, что у вас может быть значение типа Mr. Ryan <Ryan@email.com>, которое должно соответствовать Ryan@email.com.Если вместо этого у вас есть точные совпадения, я бы написал:

const checkMatch = bug => user => user.assignee === bug.assigned_to

Попытка reduce

Обычно я нахожу такие решения, объединяющие шаги, более чистые, чем reduce основанные,Но поскольку все эти шаги довольно сложны, и мне пришлось повторно использовать пользователя, найденного при фильтрации, для обновления объекта, я попробовал один reduce для сравнения.И я на самом деле предпочитаю это:

const {reduce, find, contains, append, assoc, pick} = R

const extract = (users) => reduce((all, bug) => {
  const user = find( user => contains(user.assignee, bug.assigned_to), users);
  return user
    ? append(assoc('user_id', user.id, pick(['bug_id', 'assigned_to', 'bar'], bug)), all)
    : all
}, [])
                                    
const bugs =[{"assigned_to": "jesse@email.com", "bar": 42, "baz": "z", "bug_id": "abc", "foo": 1}, {"assigned_to": "fred@flintstone.com", "bar": 43, "baz": "y", "bug_id": "def", "foo": 2}, {"assigned_to": "jesse@email.com", "bar": 44, "baz": "x", "bug_id": "ghi", "foo": 3}, {"assigned_to": "Ryan@email.com", "bar": 45, "baz": "w", "bug_id": "jkl", "foo": 4}, {"assigned_to": "Mr. Ryan <Ryan@email.com>", "bar": 46, "baz": "v", "bug_id": "mno", "foo": 5}, {"assigned_to": "wilma@flintstone.com", "bar": 47, "baz": "u", "bug_id": "pqr", "foo": 6}]

const users = [{"assignee": "jesse@email.com", "id": 843568062370470}, {"assignee": "Ryan@email.com", "id": 848490202942168}]

console.log(extract(users)(bugs))
<script src="//cdnjs.cloudflare.com/ajax/libs/ramda/0.25.0/ramda.js"></script>

(Опять же, я бы выбрал user.assignee === bug.assigned_to вместо contains, если данные это поддерживают.)

...