是否可以根据值获取对象?
在下面的示例json中,键名具有 type ,因此基于类型值需要获取结果。
例如,如果type ='user',则仅针对用户对象而非员工对象获取结果。
在这里,我很努力地同时拥有用户和员工这两个密钥,请您提出如何使用的建议
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"}]]
答案 0 :(得分:2)
您可以使用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>