Webentwicklung – die besten Beiträge

JavaScript: Wie kann ich eine große Tabelle schneller sortieren?

Hallo zusammen,

ich habe eine große Tabelle in meiner ASP.NET Core Razor Pages Anwendung, die ich clientseitig mit JavaScript sortieren möchte.

Allerdings dauert die Sortierung bei einer großen Datenmenge zu lange, und ich suche nach einer performanten Lösung.

Meine aktuelle Implementierung:

Ich nutze Array.sort() und vergleiche Strings und Zahlen entsprechend, das funktioniert aber das ist nicht effizient genug.

Besonders wenn die Tabelle viele Zeilen (z. B. >10.000) hat, wird die Sortierung langsam.

Meine Anforderungen:

✅ Die Sortierung muss komplett in JavaScript (clientseitig) erfolgen

✅ Sie muss sowohl Texte (Strings mit Umlaute, Sonderzeichen, etc.) als auch Zahlen (inkl. Währungen mit €) schnell sortieren

✅ Die Tabelle wird nachträglich dynamisch mit Daten befüllt (also keine initiale Sortierung im Backend möglich)

✅ Die Lösung soll sehr schnell auch bei großen Datenmengen sein

Ich habe bereits probiert:

❌ Array.sort() (wird langsam bei vielen Zeilen)

❌ localeCompare() (korrekt für Strings, aber langsam)

❌ TypedArrays für Zahlenwerte (bringt nicht genug Speed)

Gibt es eine bessere Möglichkeit, eine HTML-Tabelle performant zu sortieren?

Vielleicht mit Web Worker, einer anderen Datenstruktur oder anderen Algorithmen?

oder gibt es andere Funktionen/Möglichkeiten, die ich noch probieren kann?

hier mein aktueller Ansatz:

Tabelle:

    <div class="col-lg-9 col-md-7 col-12">
      <div class="table-container">
        <table class="table-modern table-hover w-100" id="statistikTable">
          <thead>
            <tr>
              <th onclick="sortTable(0, this)">Datum <img class="sort-icon" src="/img/dgvsort.png" style="display: none;"></th>
              <th onclick="sortTable(1, this)">PID <img class="sort-icon" src="/img/dgvsort.png" style="display: none;"></th>
              <th onclick="sortTable(2, this)">Nachname <img class="sort-icon" src="/img/dgvsort.png" style="display: none;"></th>
              <th onclick="sortTable(3, this)">Vorname <img class="sort-icon" src="/img/dgvsort.png" style="display: none;"></th>
              <th onclick="sortTable(4, this)">Rechnungsnetto <img class="sort-icon" src="/img/dgvsort.png" style="display: none;"></th>
              <th onclick="sortTable(5, this)">Belegnummer <img class="sort-icon" src="/img/dgvsort.png" style="display: none;"></th>
            </tr>
          </thead>
          <tbody>
            @if (Model.StatistikData != null && Model.StatistikData.Rows.Count > 0)
            {
              foreach (DataRow row in Model.StatistikData.Rows)
              {
                <tr>
                  <td>@(((DateTime)row["Datum"]).ToString("dd.MM.yyyy"))</td>
                  <td>@row["PID"]</td>
                  <td>@row["KundeNachname"]</td>
                  <td>@row["KundeVorname"]</td>
                  <td>@Convert.ToDecimal(row["Rechnungsnetto"]).ToString("N2")</td>
                  <td>@row["Belegnummer"]</td>
                </tr>
              }
            }
            else
            {
              <tr>
                <td colspan="6" class="text-center">Keine Daten gefunden</td>
              </tr>
            }
          </tbody>
        </table>
      </div>
    </div>

meine sort Funktion:

  function sortTable(columnIndex, header) {
    const table = document.getElementById("statistikTable");
    const tbody = table.tBodies[0];
    const rows = Array.from(tbody.rows);
    const ascending = table.dataset.sortOrder !== "asc";

    const isNumericColumn = !isNaN(parseFloat(rows[0].cells[columnIndex].textContent.replace("€", "").replace(",", ".").trim()));

    let sortedRows;
    if (isNumericColumn) {
      sortedRows = rows
        .map(row => ({
          element: row,
          value: parseFloat(row.cells[columnIndex].textContent.replace("€", "").replace(",", ".").trim()) || 0
        }))
        .sort((a, b) => ascending ? a.value - b.value : b.value - a.value);
    } else {
      const collator = new Intl.Collator("de", { numeric: true, sensitivity: "base" });
      sortedRows = rows
        .map(row => ({
          element: row,
          value: row.cells[columnIndex].textContent.trim()
        }))
        .sort((a, b) => ascending ? collator.compare(a.value, b.value) : collator.compare(b.value, a.value));
    }

    const fragment = document.createDocumentFragment();
    sortedRows.forEach(({ element }) => fragment.appendChild(element));
    tbody.appendChild(fragment);

    table.dataset.sortOrder = ascending ? "asc" : "desc";

    updateSortIcons(header, ascending);
  }

  function updateSortIcons(header, ascending) {
    document.querySelectorAll(".sort-icon").forEach(icon => {
      icon.src = "/img/dgvsort.png";
      icon.style.display = "inline";
    });

    const icon = header.querySelector(".sort-icon");
    if (icon) {
      icon.src = ascending ? "/img/dgvsortup.png" : "/img/dgvsortdown.png";
      icon.style.display = "inline";
    }
  }

Freue mich über jede Hilfe! 😊

HTML, Webseite, programmieren, CSS, JavaScript, HTML5, Programmiersprache, Webdesign, Webentwicklung, Frontend

Paypal SDK von USD auf EUR umstellen funktioniert nicht?

Ich habe beide Stellen im Code geändert:

script.src = `https://www.paypal.com/sdk/js?client-id=${clientId}&currency=EUR`;

und

currency_code: 'EUR',

Bekomme jedoch den folgenden Fehler https://pastebin.com/6eNUSdX9

Wichtigster Ausschnitt:

Error: Unexpected currency: EUR passed to order.create. Please ensure you are passing /sdk/js?currency=EUR in the paypal script tag. 

Der Fehler tritt auf, wenn ich USD auf EUR ändere. Hier ist meine

/app/paypal/page.tsx

https://pastebin.com/9GM500eR die ganze datei

Wichtigster Ausschnitt: der mit USD funktioniert:

<PayPalScriptProvider options={{ clientId }}>
            <div className="flex justify-center">
              <PayPalButtons
                style={{
                  layout: 'vertical',
                  color: 'blue',
                  shape: 'rect',
                  label: 'paypal',
                }}
                createOrder={(data, actions) => {
                  if (!actions || !actions.order) {
                    console.error('Fehler: actions.order ist nicht definiert');
                    return Promise.reject('Fehler bei der Erstellung der Bestellung');
                  }
 
                  return actions.order.create({
                    purchase_units: [
                      {
                        amount: {
                          currency_code: 'USD',
                          value: '100.00',
                        },
                      },
                    ],
                    intent: 'CAPTURE'
                  });
                }}
                onApprove={(data, actions) => {
                  if (!actions || !actions.order) {
                    console.error('Fehler: actions.order ist nicht definiert');
                    return Promise.reject('Fehler bei der Genehmigung der Bestellung');
                  }
 
                  return actions.order.capture().then((details) => {
                    console.log('Zahlung erfolgreich abgeschlossen:', details);
                    setPaymentSuccess(true);  // Zeigt die Erfolgsmeldung an
                    setErrorMessage('');  // Setzt die Fehlermeldung zurück
                    return Promise.resolve();
                  });
                }}
                onError={(err) => {
                  console.error('Fehler bei der PayPal-Zahlung:', err);
                  setErrorMessage('Es gab ein Problem bei Ihrer Zahlung. Bitte versuchen Sie es erneut.'); // Zeigt die Fehlermeldung an
                  setPaymentSuccess(false); // Setzt den Zahlungserfolgsstatus zurück
                }}
              />
            </div>
          </PayPalScriptProvider>

Meine

env Datei ist folgendermaßen konfiguriert:
makefile
Code kopieren
NEXT_PUBLIC_PAYPAL_CLIENT_ID = "12345"
PAYPAL_CLIENT_ID = "12345"
PAYPAL_CLIENT_SECRET = "ABCDEF"
PAYPAL_WEBHOOK_SECRET="XYZ123"

Ich habe den currency_code von 'USD' auf 'EUR' geändert und auch die URL des PayPal-Skripts angepasst:

script.src = `https://www.paypal.com/sdk/js?client-id=${clientId}&currency=EUR`;

Trotzdem bekomme ich den Fehler, dass EUR nicht als Währung erkannt wird.

Ich habe die Dokumentation auf PayPal Developer überprüft, und laut dieser ist

EUR

der richtige Währungscode.

  • Ich benutze Next.js 15 und habe auf React 18 downgraden müssen, da React 19 nicht mit
@paypal/react-paypal-js
  • kompatibel ist aber spielt eigentlich keiner olle und sowohl im sandbox oder live modus dasselbe das man nach dem klick auf dem button mit EUR einen fehler bekommt.

Kann mir jemand helfen, was hier das Problem ist?

PC, Computer, Internet, App, Technik, IT, Webseite, JavaScript, Code, Informatik, PayPal, Programmiersprache, sdk, Webentwicklung, node.js

Als Anfänger Chat-App programmieren aka (Facebook)?

Eigentlich wollte ich eine vereinfachte Uber-App versuchen nachzubauen, habe aber in der ersten Frage viele Antworten bekommen, dass es zu schwer für einen Anfänger ist und z.B. eine Chat-App etwas einfacher wäre.

Deswegen will ich in drei Monaten mein erstes großes Projekt anfangen zu bauen und zwar so eine Chat-App, wo man mit Freunden schreiben und Fotos teilen kann. Also so eine Art Facebook (aber sehr sehr vereinfacht!).

Ich habe gestern auch den Film "The Social Network" nochmal geguckt und jetzt will ich noch mehr die App bauen.

Jetzt die Frage: Hat jemand schon von euch Erfahrung mit einer Chat-App?

Was müsste ich alles wissen (Webentwicklung)?

Und wie viele Stunden brauche ich circa für die einzelnen Themen, um sich an dieses Projekt zu trauen?

Ich finde, dass man beim Learning-by-doing sehr gut lernt und deswegen will ich auch nicht nur lernen, sondern einfach versuchen, auch etwas zu bauen und wenn ich nicht weiterkomme, dann kurz nachschauen, versuchen zu verstehen und zu lernen, was ich machen muss und dann umsetzen, usw..

Auch wenn es ein mega Fail und die App am Ende nicht gut wird, habe ich trotzdem dann viel gelernt und werde es beim nächsten Mal besser machen.

Also zwei Fragen: Was müsste ich alles dafür können und wie viele Stunden Lernzeit ungefähr braucht man dafür, um damit anfangen zu können?

Computer, Software, App, Chat, Programm, HTML, Webseite, Programmierer, programmieren, CSS, Facebook, Java, JavaScript, Android, Informatik, Programmiersprache, Softwareentwicklung, Webentwicklung

Meistgelesene Beiträge zum Thema Webentwicklung