Логика упорядочивания массивов на основе другого ключа массива и направления (влево или вправо)


Fatal error: Uncaught Exception: Maximum number of characters exceeded: 5000 in E:OSPaneldomains ranslate.myviewTranslate.php:87 Stack trace: #0 E:OSPaneldomains ranslate.myviewTranslate.php(41): DejurinGoogleTranslateForFree::requestTranslation('en', 'ru', '<p>I am f...', 5) #1 E:OSPaneldomains ranslate.myviewTranslate.php(213): DejurinGoogleTranslateForFree::translate('en', 'ru', '<p>I am f...', 5) #2 E:OSPaneldomains ranslate.mycontrollersFront_controller.php(9): include('E:\OSPanel\doma...') #3 E:OSPaneldomains ranslate.myindex.php(3): include('E:\OSPanel\doma...') #4 {main} thrown in E:OSPaneldomains ranslate.myviewTranslate.php on line 87

Всего 1 ответ

Автоматический диспенсер мыльной пены от xiaomi.


Вы можете добавить все значения в основной массив и отсортировать по направлению и значению.

const
    log = o => console.log(JSON.stringify(o)),
    sign = { L: -1, R: 1 },
    add = (values, insert) => [...values, insert].sort((a, b) =>
        (a[1] === 'R') - (b[1] === 'R') ||
        a[0] * sign[a[1]] - b[0] * sign[b[1]]
    );

log(add([[20, 'L'], [10, 'L'], [30, 'R'], [40, 'R'], [50, 'R']], [60, 'L'])); // 60 20 10 30 40 50 L L L R R R
log(add([[10, 'R'], [20, 'R'], [30, 'R'], [40, 'R'], [50, 'R']], [60, 'L'])); // 60 10 20 30 40 50 L R R R R R
log(add([[50, 'L'], [40, 'L'], [30, 'L'], [20, 'L'], [10, 'L']], [60, 'L'])); // 60 50 40 30 20 10 L L L L L L
log(add([[50, 'L'], [40, 'L'], [20, 'L'], [10, 'L']], [30, 'L'])); // 50 40 30 20 10 L L L L L
log(add([[50, 'L'], [40, 'L'], [20, 'R'], [10, 'R']], [30, 'L'])); // 50 40 30 20 10 L L L L L

Подход без сортировки. Для этого подхода необходим отсортированный массив для поиска индекса.

const
    log = o => console.log(JSON.stringify(o)),
    sign = { L: -1, R: 1 },
    add = (array, insert) => {
        let i = array.findIndex(([v, d]) => insert[0] * sign[insert[1]] < v * sign[d]);
        if (i === -1) array.push(insert)
        else array.splice(i, 0, insert);
        return array;
    };

log(add([[20, 'L'], [10, 'L'], [30, 'R'], [40, 'R'], [50, 'R']], [60, 'L'])); // 60 20 10 30 40 50 L L L R R R
log(add([[10, 'R'], [20, 'R'], [30, 'R'], [40, 'R'], [50, 'R']], [60, 'L'])); // 60 10 20 30 40 50 L R R R R R
log(add([[50, 'L'], [40, 'L'], [30, 'L'], [20, 'L'], [10, 'L']], [60, 'L'])); // 60 50 40 30 20 10 L L L L L L
log(add([[50, 'L'], [40, 'L'], [20, 'L'], [10, 'L']], [30, 'L'])); // 50 40 30 20 10 L L L L L
log(add([[50, 'L'], [40, 'L'], [10, 'R'], [20, 'R']], [30, 'L'])); // 50 40 30 20 10 L L L L L


Есть идеи?

10000