Узел Рамда + найти объект по значению - PullRequest
0 голосов
/ 04 июля 2018

Возможно ли получить объект по значению?

В приведенном ниже примере json имя ключа имеет тип , поэтому на основе значения типа необходимо получить результаты.

Например, если type = 'user', получить результат только для объекта users, а не для employee.

Здесь я изо всех сил стараюсь иметь оба ключа (пользователей и сотрудников). Подскажите, пожалуйста, как подойти

var list =[
  {"doc":{"type":"user","Title":"test1","Relations":{"users":[{"name": "user1"},{"name": "user2"},{"name": "user3"}],"employee":[{"emp": "user2"}]}}},
  {"doc":{"type":"employee","Title":"test2","Relations":{"users":[{"name": "user1"}],"employee":[{"name": "emp1"},{"name": "emp2"},{"name": "emp3"}]}}}
];

const getDetails = R.chain(R.pipe(
  R.path(['doc', 'Relations']),
  R.pick(['users', 'employee']),
  R.values
))

const result = getDetails(list)

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

Токовый выход:

[[{"name": "user1"}, {"name": "user2"}, {"name": "user3"}], [{"emp": "user2"}], [{"name": "user1"}], [{"name": "emp1"}, {"name": "emp2"}, {"name": "emp3"}]]

Ожидаемый вывод:

[[{"name": "user1"}, {"name": "user2"}, {"name": "user3"}], [{"name": "emp1"}, {"name": "emp2"}, {"name": "emp3"}]]

1 Ответ

0 голосов
/ 04 июля 2018

Вы можете использовать R.cond для ветвления логики на основе набора предикатов, например, является ли type user или employee в вашем примере.

При таком подходе вам нужно будет переключить R.chain на R.map, чтобы он соответствовал ожидаемому списку, если только вы не хотите дополнительного выравнивания массивов.

const list = [
  {"doc":{"type":"user","Title":"test1","Relations":{"users":[{"name": "user1"},{"name": "user2"},{"name": "user3"}],"employee":[{"emp": "user2"}]}}},
  {"doc":{"type":"employee","Title":"test2","Relations":{"users":[{"name": "user1"}],"employee":[{"name": "emp1"},{"name": "emp2"},{"name": "emp3"}]}}}
]

const getDetails = R.map(R.pipe(
  R.prop('doc'),
  R.cond([
    [R.propEq('type', 'user'), R.path(['Relations', 'users'])],
    [R.propEq('type', 'employee'), R.path(['Relations', 'employee'])]
  ])
))

const expected = [[{"name": "user1"}, {"name": "user2"}, {"name": "user3"}], [{"name": "emp1"}, {"name": "emp2"}, {"name": "emp3"}]]

console.log(R.equals(expected, getDetails(list)))
<script src="//cdnjs.cloudflare.com/ajax/libs/ramda/0.25.0/ramda.min.js"></script>
...