Запрос indexedDB getAll
возвращает массив data
объектов, каждый с двумерным встроенным ключом, например { 'key' : [2,5], ... }
. Все ключи имеют одинаковые значения key[0]
, и возвращается массив, отсортированный по key[1]
; однако key[1]
может иметь пропуски из-за того, что пользователь создал запись, а затем удалил ее. Метод обратной заливки используется для повторного использования удаленных ключей, но он никогда не может гарантировать отсутствие пробелов.
Массив seq
, содержащий последовательность, в которой должны отображаться объекты данных, также предоставляется. Это массив значений key[1]
.
Я хочу просмотреть массив последовательностей, каждый раз получая запись из массива объектов данных с соответствующим значением key[1]
; но нет прямой карты. Например, массив последовательности может быть [10,4,7,1,3,5,9]
, а массив данных будет [ { 'key' : [n,1], ...}, { ['key' : [n,3],...}, { 'key' : [n,4],...}, { 'key' : [n,5],...}, { 'key' : [n,7],...}, { 'key' : [n,9],...}, { 'key' : [n,10],...} ]
. Таким образом, когда третьим отображаемым объектом является объект key[1] = 7
, мне нужно знать, что это пятый элемент в массиве данных.
Я использовал объект для сопоставления, например:
k = new Object();
data.forEach( ( v, i ) => { k[ v.key[1] ] = i; } );
И использовать его для ссылки как:
seq.forEach( (v, i ) => { e = data[ k[ v ] ]; } );
или
for ( i = 0; i < seq.length; i++ ) { e = data[ k[ seq[i] ] ]; };
Есть ли лучше путь? Спасибо.
Обновитесь, немного подумав и осознав, насколько я иногда глуп.
Иногда я могу быть таким глупым. Я думал, что сошел с пути, рассматривая эту простую проблему как задачу придумать какое-то отображение индекса между массивами seq
и data
; и подумал, что все, что требуется, это отсортировать data
по key[1]
в соответствии с порядком последовательности, указанным в массиве seq
из значений key[1]
. В некотором смысле это правильно.
Таким образом, объект k
не будет нужен, и, так сказать, можно будет отсортировать data
на месте. Я думал, что k
- это копия массива data
с именами свойств, равными требуемому индексу, и что этот подход не был эффективным. Однако, как указывает @barmar ниже, k
не содержит копии объектов в data
, а содержит только их ссылки. А создание объекта ссылок должно быть более эффективным, чем сортировка массива на месте и фактическое «перемещение» данных. Я предполагаю, что это похоже на использование указателей.
Я включил приведенный ниже фрагмент кода только для иллюстрации, хотя он, вероятно, не так эффективен, потому что кому-то на моем нижнем уровне было интересно создать сортировку функция основана на свойстве объекта. Фрагмент демонстрирует, как взять приведенный мною пример, чтобы задать этот вопрос, и отсортировать его на месте в порядке последовательности в seq
. В этом нет ничего нового или нового. Вы увидите, что data
в порядке key[1]
, как в seq
, а свойство p
в возрастающем числовом порядке от 1 до 7, указывая их желаемые позиции только для иллюстрации.
Спасибо .
var seq = [10,4,7,1,3,5,9],
data = [ { 'key' : [5,1], 'p' : 4 },
{ 'key' : [5,3], 'p' : 5 },
{ 'key' : [5,4], 'p' : 2 },
{ 'key' : [5,5], 'p' : 6 },
{ 'key' : [5,7], 'p' : 3 },
{ 'key' : [5,9], 'p' : 7 },
{ 'key' : [5,10], 'p' : 1 } ];
data.sort( ( a, b ) => { return seq.indexOf( a.key[1] ) - seq.indexOf( b.key[1] ); } );
console.log( data );