sortedIndex для обратного отсортированного массива?

javascript arrays sorting lodash

382 просмотра

1 ответ

6789 Репутация автора

Похоже, что sortedIndex от lodash ожидает сортированный вперед массив для его двоичного поиска. (например [0,1,2,4])

Есть ли способ использовать sortedIndexBy, когда массив обратно отсортирован? (например [4,2,1,0])?

> _.sortedIndex( [0,1,2,4], 3 )
> 3
> _.sortedIndex( [4,2,1,0], 3 )
> 4

Чтобы заставить это работать сейчас, я должен перевернуть массив, найти sortedIndex, вставить новый элемент, а затем отменить инверсию массива.


Обратите внимание - нужно что-то, что работает для сортировки строк и чисел.

['A','B','D']в ['D','B','A']и вставить 'C'.

Автор: jedierikb Источник Размещён: 19.07.2016 02:19

Ответы (1)


3 плюса

8624 Репутация автора

Решение

Как насчет _.sortedIndexBy ?

Отредактировано: для stringсравнения, String.prototype.charCodeAt () может помочь вам преобразовать его в Number, тогда можно применить ту же логику.

const arr1 = [0, 1, 2, 4];
const arr2 = [4, 2 ,1, 0];

console.log(_.sortedIndex(arr1, 3 ));
// Similar, but with ranking function.
console.log(_.sortedIndexBy(arr2, 3, function(x) {return -x;}));

const charArr = ['D','B','A'];
// Take the first char and convert to Number
let index = _.sortedIndexBy(charArr, 'C', function(x) {
  // Type checks. (If you want it to be general to many types..
  if (typeof x === 'string') {
    return -x.charCodeAt(0);
  } else if (typeof x === 'number') {
    return -x;
  } // else ... for other types.....
});

console.log('To insert char C, put it to index: ', index);
<script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.13.1/lodash.min.js"></script>

или _.sortedIndex , он также имеет итерацию для ранжирования до 4.0.0

    const arr1 = [0, 1, 2, 4];
    const arr2 = [4, 2 ,1, 0];

    console.log(_.sortedIndex(arr1, 3));
    console.log("Reversed order without ranking func: ",_.sortedIndex(arr2, 3));
    // Ranking function to inverse the order.
    console.log("Reversed order with ranking func: ",_.sortedIndex(arr2, 3, function(x) {return -x;}));
<script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/1.3.1/lodash.min.js"></script>

Благодаря pilau: sortedIndex ожидает, что массив будет отсортирован в прямом направлении, поэтому мы не можем просто поместить и отсортировать массив в обратном arr.length - indexпорядке, и для обработки различных сценариев, я думаю, нам нужно сделать либо

  • Обратный массив -> получить отсортированный индекс и поставить -> перевернуть его снова. или же
  • Получить обратную копию по слайсу и в обратном порядке -> получить отсортированный индекс и вычислить arr.length - index-> вставить в исходный массив.

Для достижения ожидаемого результата.

Автор: fuyushimoya Размещён: 19.07.2016 02:39
Вопросы из категории :
32x32