Ramda嵌套对象的排序数组

时间:2020-03-31 10:58:06

标签: javascript reactjs ramda.js

我正在寻找使用Ramda对嵌套对象数组进行排序的方法。我有一个数组:

const people = [
  { name: 'Emma', data:{ age: 70 }},
  { name: 'Peter', data:{  age: 78 }},
  { name: 'Mikhail', data:{  age: 62 }},
];

我想使用Ramda在数组上方进行排序。我得到了this,但对我不起作用。

我们将非常感谢您的帮助。

2 个答案:

答案 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.gf到产生新功能。要在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>