在这种情况下,我需要按名称对一个对象数组进行排序。
Array = [
{id: 3d4, name: A2},
{id: 7b2, name: A1+ Beta},
{id: 9h5, name: A2 Beta},
{id: 1x1, name: A1+}
]如何使用Ramda按以下顺序对其进行排序:
我已经想过按名字的长度分开,然后再订货,但我还是坚持住了。有人能帮我吗?
发布于 2021-04-10 06:14:46
您可以在将数组拆分为R.reverse后,尝试将其反转。
const array = [
{id: '3d4', name: 'A2'},
{id: '9hh', name: 'A3 Beta'},
{id: '7b2', name: 'A1+ Beta'},
{id: '9h5', name: 'A2 Beta'},
{id: '1x1', name: 'A1+'},
{id: '1x2', name: 'A3+'}
];
// pick name and convert to lowercase if required.
const namePropCompose = R.compose(R.toLower, R.prop('name'));
// split by '+ ' or ' ' and reverse the array.
const splitNameAndReverse = R.compose(R.reverse, R.split(new RegExp('[+]?\\s')));
// finally sort with reversed array
const sortByNameCaseInsensitive = R.sortBy(R.compose(splitNameAndReverse, namePropCompose));
const result = sortByNameCaseInsensitive(array);
console.log(JSON.stringify(result))<script src="https://cdnjs.cloudflare.com/ajax/libs/ramda/0.27.1/ramda.min.js" integrity="sha512-rZHvUXcc1zWKsxm7rJ8lVQuIr1oOmm7cShlvpV0gWf0RvbcJN6x96al/Rp2L2BI4a4ZkT2/YfVe/8YvB2UHzQw==" crossorigin="anonymous"></script>
为了获得更好的可读性,我把它们都分成了不同的组合。Regex and toLower在这里可能没有那么有用,简而言之,如果您想要在一行中完成所有这些操作的话。
sortBy(compose(reverse, split(' '), prop('name')))发布于 2021-04-10 03:06:08
在Ramda的文档上找到的,非常简单,您可以使用以下内容创建过滤函数:const sortByNameCaseInsensitive = R.sortBy(R.compose(R.toLower, R.prop('name')));
然后将数组应用到其中,sortByNameCaseInsensitive(arr);
发布于 2021-04-10 10:10:05
我认为['A1+', 'A2', 'A1+ Beta', 'A2 Beta']的排名很武断,可能会建议手动排序优先级。
position数组中查找每个rank的scoresa - b
const scores = ['A1+', 'A2', 'A1+ Beta', 'A2 Beta'];
const findScorePriority = R.pipe(
R.prop('name'),
R.equals,
R.findIndex(R.__, scores),
);
const byPriority = R.useWith(
R.subtract,
[findScorePriority, findScorePriority],
);
const data = [
{ id: '3d4', name: 'A2' },
{ id: '7b2', name: 'A1+ Beta' },
{ id: '9h5', name: 'A2 Beta' },
{ id: '1x1', name: 'A1+' },
];
console.log(
R.sort(byPriority, data),
);<script src="https://cdnjs.cloudflare.com/ajax/libs/ramda/0.27.1/ramda.js" integrity="sha512-3sdB9mAxNh2MIo6YkY05uY1qjkywAlDfCf5u1cSotv6k9CZUSyHVf4BJSpTYgla+YHLaHG8LUpqV7MHctlYzlw==" crossorigin="anonymous"></script>
https://stackoverflow.com/questions/67030312
复制相似问题