Как игнорировать новые строки в порядке lodash - PullRequest
0 голосов
/ 19 сентября 2018

Я упорядочиваю массив, используя 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' }];

[править: вфактический факт мне нужно отсортировать по большему количеству полей, поэтому фактическая сортировка будет больше похожа на код ниже]

 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']);

Ответы [ 2 ]

0 голосов
/ 19 сентября 2018

Используйте _.sortBy вместо.Вы можете отобразить значения перед упорядочением:

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 для получения индекса дня недели и возвратаэто вместо этого.

0 голосов
/ 19 сентября 2018

РЕДАКТИРОВАТЬ: ПЕРЕСМОТРЕН МОЙ ОТВЕТ - действительно возможно использовать 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>

Замена может быть скорректирована, если необходимо - это просто для иллюстрации того, как ее можно определить.Несколько критериев все еще могут быть переданы в виде массива

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', value: 2 },
 { text: 'xxx', value: 1 },
 { text: shouldBeFirst },
 { text: 'yyy', value: 42 },
 { text: 'yyy', value: 12 },
 { text: shouldBeSecond},
 { text: 'zzz', value: 7 }];

//separating criteria for better readability
const criteria1 = item => item.text.replace(/\s+/g, " ");
const criteria2 = 'value'; //you can still pick by property name

//order by sanitized values of the text property first, followed by the value property
const ordered = _.orderBy(array, [criteria1, criteria2]);

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