Flaschenpost.de Bestpreis Sortierer

Sortiert Angeboote auf flaschenpost.de nach Bestpreis pro Liter.

// ==UserScript==
// @name            Flaschenpost.de Bestpreis Sortierer
// @description     Sortiert Angeboote auf flaschenpost.de nach Bestpreis pro Liter.
// @namespace       https://www.flaschenpost.de
// @version         0.14
// @license         MIT
// @match           https://www.flaschenpost.de/*
// @run-at          document-end
// @icon            https://www.google.com/s2/favicons?sz=64&domain=flaschenpost.de
// @require         https://code.jquery.com/jquery-3.6.3.js
// ==/UserScript==

$(window).bind("load", function() {
    const sortButton = $(`<button
            id="bestpreisbtn"
            class="fp_button fp_button_primary fp_button_medium"
            style="margin-top: 1.25rem;">Sortieren nach Bestpreis
        </button>`);

    sortButton.click(function() {
        $('.products_list_vue_container, .products_grid_vue_container, .product_groups').each(function() {
            const listElements = $(this).find('.fp_product');

            console.log('listElements', listElements);

            $(listElements).sort(function(a, b) {
                function extract_price(e) {
                    const priceElements = $(e).find('.fp_article_pricePerUnit_deposit');
                    const prices = $.map(priceElements, function (e) {
                        const htmlText = $(e).text();
                        console.log('htmlText', htmlText);
                        const regExMatch = htmlText.match(/\(([0-9\,]+) €\//);  // match (_,__ €/___...) Unit can be "L" "Liter" "kg"
                        console.log('regExMatch', regExMatch);
                        return Number.parseFloat(regExMatch[1].replace(',', '.'));
                    });

                    console.log('prices', prices);
                    return Math.min(...prices);
                }

                return extract_price(a) - extract_price(b);
            }).appendTo(this);
        });
    });

    setInterval(() => {
        if (!$('.fp-benefits_holder #bestpreisbtn').length) {
            $('.fp-benefits_holder').append(sortButton);
        }
    }, 1000);
});