我正在寻找使用Ramda对嵌套对象数组进行排序的方法。我有一个数组:
const people = [
{ name: 'Emma', data:{ age: 70 }},
{ name: 'Peter', data:{ age: 78 }},
{ name: 'Mikhail', data:{ age: 62 }},
];
我想使用Ramda在数组上方进行排序。我得到了this,但对我不起作用。
我们将非常感谢您的帮助。
答案 0 :(得分:3)
使用R.path获取data.age
:
const sortByYoungest = R.sortBy(R.path(['data', 'age']))
const people = [{"name":"Emma","data":{"age":70}},{"name":"Peter","data":{"age":78}},{"name":"Mikhail","data":{"age":62}}];
const result = sortByYoungest(people);
console.log(result);
<script src="https://cdnjs.cloudflare.com/ajax/libs/ramda/0.27.0/ramda.js" integrity="sha256-buL0byPvI/XRDFscnSc/e0q+sLA65O9y+rbF+0O/4FE=" crossorigin="anonymous"></script>
从Nick's answer进入页面,您可以使用R.pipe创建可重复使用的sortByPath
函数:
const sortByPath = R.pipe(R.path, R.sortBy)
const sortByYoungest = sortByPath(['data', 'age'])
const people = [{"name":"Emma","data":{"age":70}},{"name":"Peter","data":{"age":78}},{"name":"Mikhail","data":{"age":62}}];
const result = sortByYoungest(people);
console.log(result);
<script src="https://cdnjs.cloudflare.com/ajax/libs/ramda/0.27.0/ramda.js" integrity="sha256-buL0byPvI/XRDFscnSc/e0q+sLA65O9y+rbF+0O/4FE=" crossorigin="anonymous"></script>
答案 1 :(得分:1)
当您要按路径data.age
进行排序时,可以使用data
从对象中获得道具R.prop
,这将为您提供一个对象,然后使用{{1} }在该对象上再次获取R.prop()
属性。要创建执行此操作的功能,可以使用age
:
R.compose()
const byAge = R.ascend(R.compose(R.prop('age'), R.prop('data')));
const people = [
{ name: 'Emma', data:{ age: 70 }},
{ name: 'Peter', data:{ age: 78 }},
{ name: 'Mikhail', data:{ age: 62 }},
];
const peopleByYoungestFirst = R.sort(byAge, people);
console.log(peopleByYoungestFirst);
//=> [{"name":"Mikhail","data":{"age":62}},{"name":"Emma","data":{"age":70}},{"name":"Peter","data":{"age":78}}]
要分解上面的撰写功能,请说您拥有对象<script src="https://cdnjs.cloudflare.com/ajax/libs/ramda/0.27.0/ramda.js" integrity="sha256-buL0byPvI/XRDFscnSc/e0q+sLA65O9y+rbF+0O/4FE=" crossorigin="anonymous"></script>
,即:
obj
执行obj = { name: 'Emma', data:{ age: 70 }}
将给出:
R.prop('data')(obj)
由于您对返回的对象的{ age: 70 }
属性感兴趣,因此可以再次在上述对象上运行age
:
R.prop('age')
这将得到R.prop('age')({age: 70})
。所以上面的行可以写成:
70
该函数的问题是,它没有返回一个我们可以传递R.prop('age')(R.prop('data')(obj))
^^^^^ f ^^^^^ ^^^^^^ g ^^^^^ ^ x
来退出obj
的函数。当前,它采用70
的形式,通过组成它,我们可以得到f(g(x))
的形式,其中(f.g)(x)
组成函数f.g
和f
到产生新功能。要在Ramda中撰写,我们可以使用g
:
R.compose()
可以像示例中那样将它{eta}简化为删除R.compose(R.prop('age'), R.prop('data'))(obj)
。
这种方法可以推广为:
obj
const {pipe, split, reverse, map, apply, compose, ascend} = R;
const makeSortFn = compose(ascend, pipe(split('.'), reverse, map(R.prop), apply(compose)));
const byAge = makeSortFn('data.age');
const people = [
{ name: 'Emma', data:{ age: 70 }},
{ name: 'Peter', data:{ age: 78 }},
{ name: 'Mikhail', data:{ age: 62 }},
];
const peopleByYoungestFirst = R.sort(byAge, people);
console.log(peopleByYoungestFirst);
//=> [{"name":"Mikhail","data":{"age":62}},{"name":"Emma","data":{"age":70}},{"name":"Peter","data":{"age":78}}]
但是,我更喜欢Ori's approach,它可以通过分割字符串来更容易地生成:
<script src="https://cdnjs.cloudflare.com/ajax/libs/ramda/0.27.0/ramda.js" integrity="sha256-buL0byPvI/XRDFscnSc/e0q+sLA65O9y+rbF+0O/4FE=" crossorigin="anonymous"></script>