javascript 如何忽略lodash orderBy中的新行

vltsax25  于 2023-03-28  发布在  Java
关注(0)|答案(2)|浏览(102)

我正在使用lodash/orderBy命令一个数组。我无法控制数组中返回的内容。当我的数组项中有新行时,它们就不会按照我期望的顺序排列。有什么方法可以忽略新行吗?或者有什么其他方法可以让项目正确排序?

const shouldBeFirst = 'My message\r\n\r\nshould consist of A A A A some 
text';
const shouldBeSecond= 'My message\r\n\r\nshould consist of \r\n\r\n some 
text';

const array = [
 { text: 'xxx' },
 { text: shouldBeFirst },
 { text: 'yyy' },
 { text: shouldBeSecond},
 { text: 'zzz' }];

const ordered = orderBy(array, ['day'], ['asc']);

我希望这些物品的摆放顺序是

{ text: shouldBeFirst },
 { text: shouldBeSecond},
 { text: 'xxx' },
 { text: 'yyy' },
 { text: 'zzz' }];

但是我把它们放在里面的顺序是:

{ text: shouldBeSecond },
 { text: shouldBeFirst },,
 { text: 'xxx' },
 { text: 'yyy' },
 { text: 'zzz' }];

[edit:实际上我需要按更多的字段排序,所以实际的排序看起来更像下面的代码]

const array = [
 { text: 'xxx', day: 'monday', hour: '12' },
 { text: shouldBeFirst, day: 'tuesday', hour: '12' },
 { text: 'yyy', day: 'wednesday', hour: '12' },
 { text: shouldBeSecond, day: 'thursday', hour: '12'},
 { text: 'zzz', day: 'friday', hour: '12' }];

const ordered = orderBy(array, ['day', 'hour', 'text'], ['asc', 'asc', 'asc']);
8iwquhpp

8iwquhpp1#

实际上可以使用orderBy
您可以使用orderBy通过提供一个用于比较的函数来实现这一点。

const shouldBeFirst = 'My message\r\n\r\nshould consist of A A A A some text';
const shouldBeSecond= 'My message\r\n\r\nshould consist of \r\n\r\n some text';

const array = [
 { text: 'xxx' },
 { text: shouldBeFirst },
 { text: 'yyy' },
 { text: shouldBeSecond},
 { text: 'zzz' }];

const ordered = _.orderBy(array, item => item.text.replace(/\s+/g, " "));

console.log(ordered)
<script src="https://cdn.jsdelivr.net/npm/lodash@4.17.11/lodash.min.js"></script>

如果需要,可以调整替换-这只是为了说明如何定义它。
一个二个一个一个

qfe3c7zg

qfe3c7zg2#

使用_.sortBy代替。您可以在排序之前Map值:

const ordered = _.sortBy(array, arrayItem => arrayItem.text.replace(/\W+/g, " "));

/\W+/g是一个正则表达式,它在比较数组项之前从数组项中删除所有非字母数字字符。
如果你想按多个值排序:

const ordered = _(array).chain()
                        .sortBy(arrayItem => arrayItem.day)
                        .sortBy(arrayItem => arrayItem.hour)
                        .sortBy(arrayItem => arrayItem.text.replace(/\W+/g, " "))
                        .value();

但是,这将按字母顺序而不是按周中的顺序对工作日进行排序-您可以始终使用moment库获取工作日的索引并返回该索引。

相关问题