5.8. Демонстрация - Дозапрос элементов с API
Шаг 1
Некоторые веб-приложения выводят уже сортированный набор данных пользователю, а затем, дозапрашивая данные с сервера, добавляют их в этот набор и сортируют заново. Но ведь гораздо проще и эффективнее, имея небольшой массив и небольшой набор добавляемых данных, просто поддерживать наш массив отсортированным! Самый простой из примеров, где это может использоваться — инвестиционное приложение, которое сразу же показывает сегодняшние цены на популярные акции, а затем подгружает остальные. Как уже было сказано в прошлой статье, сортировка вставкой — одна из немногих, которая может с небольшой сложностью поддержать любой наш список сортированным. Давайте напишем функцию sortPush, с помощью которой можно будет добавить новый элемент в уже отсортированный массив из цен акций.
import {log} from "./logger";
function sortPush(array, element) {
return array;
}
// Список из заранее загруженных данных
const data = [
{
ticker: 'WISH',
price: 5.14
},
{
ticker: 'SPCE',
price: 20.10
},
{
ticker: 'AAPL',
price: 151.86
},
{
ticker: 'QCOM',
price: 155.98,
},
{
ticker: 'ABNB',
price: 178.06,
}
];
const loaded = {
ticker: 'BABA',
price: 166.99
}
log(sortPush(data, loaded)); // Добавит новый элемент предпоследним в наш список
Шаг 2
Несмотря на то, что мы рассматривали сортировку вставкой только в связном списке, алгоритм вставки в массив почти не меняется: нам также нужно сначала найти место, где должен встать новый элемент, найдя первый элемент больше него.
import {log} from "./logger";
function sortPush(array, element) {
// Сначала предположим, что элемент пойдет прямо в начало массива
let pointOfInsertion = 0;
// Пока не встретим элемент больше вставляемого или конец массива...
while (pointOfInsertion < array.length && element.price > array[pointOfInsertion].price) {
// ... двигаем указатель на место вставки
pointOfInsertion++;
}
return array;
}
// Список из заранее загруженных данных
const data = [
{
ticker: 'WISH',
price: 5.14
},
{
ticker: 'SPCE',
price: 20.10
},
{
ticker: 'AAPL',
price: 151.86
},
{
ticker: 'QCOM',
price: 155.98,
},
{
ticker: 'ABNB',
price: 178.06,
}
];
const loaded = {
ticker: 'BABA',
price: 166.99
}
log(sortPush(data, loaded)); // Добавит новый элемент предпоследним в наш список
Шаг 3
А вместо обновления связей, как мы сделали бы в связном списке, разделим наш массив на части до и после вставляемого элемента и положим его между ними.
import {log} from "./logger";
function sortPush(array, element) {
// Сначала предположим, что элемент пойдет прямо в начало массива
let pointOfInsertion = 0;
// Пока не встретим элемент больше вставляемого или конец массива...
while (pointOfInsertion < array.length && element.price > array[pointOfInsertion].price) {
// ... двигаем указатель на место вставки
pointOfInsertion++;
}
return pointOfInsertion === 0
? [element, ...array]
: [...array.slice(0, pointOfInsertion), element, ...array.slice(pointOfInsertion)];
}
// Список из заранее загруженных данных
const data = [
{
ticker: 'WISH',
price: 5.14
},
{
ticker: 'SPCE',
price: 20.10
},
{
ticker: 'AAPL',
price: 151.86
},
{
ticker: 'QCOM',
price: 155.98,
},
{
ticker: 'ABNB',
price: 178.06,
}
];
const loaded = {
ticker: 'BABA',
price: 166.99
}
log(sortPush(data, loaded)); // Добавит новый элемент предпоследним в наш список
File logger
const results = document.getElementById('results')
export function log(stocks) {
for (const {ticker, price} of stocks) {
const result = document.createElement('li');
result.innerHTML = `${ticker}: ${price}$`;
results.appendChild(result);
}
}