Лучший способ ссылаться на объекты данных с помощью встроенного ключа в соответствии с отдельным массивом последовательности? - PullRequest
0 голосов
/ 12 марта 2020

Запрос 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 );

1 Ответ

0 голосов
/ 12 марта 2020

Не помещайте индекс в k, поместите сам объект.

data.forEach(v => k[v.key[1]] = v);
...