基于另一个数组键和方向(左或右)的数组排序逻辑

Array ordering logic based on another array key and direction (left or right)

我面临这样一种情况,我需要根据另一个数组的索引和方向(左或右)对一个数组进行排序。这种排序的关键是我有一组基于数组的水平轴排序的图表。这种水平排列基于显示历史数据的网络服务。同样,有一个选项可以查看排列为垂直(堆栈)的水平图表的实时值。当前的逻辑是通过迭代形成水平图表的数组来创建垂直图表。但问题是,在某些情况下,此迭代涉及另一个导致订单更改的 web 服务调用。结果水平顺序与垂直顺序不匹配。

如附图所示。Array Order Logic。在图表容器中,图表按顺序排列,并根据其方向排列。

图表容器中的排列逻辑:

  1. 当图表容器为空时
    项目 A 方向
    输出:A(L)
    项目 B 方向
    输出:B(L) A(L) 项目 C 方向
    输出:B(L) A(L) C(R) 等..

  2. 图表列表中的预期排列逻辑
    L - 左方向
    R-右方向

场景- 1:

如果当前状态为:20 10 30 40 50
状态方向:L L R R R

要添加的新项目:60 L

预期顺序:60 20 10 30 40 50 L L L R R R

情景2

如果当前状态为:10 20 30 40 50
状态方向:R R R R R

要添加的新项目:60L

预期顺序:60 10 20 30 40 50
顺序方向:L R R R R R

场景3

如果当前状态为:50 40 30 20 10
状态方向:L L L L L

要添加的新项目:60L

预期顺序:60 50 40 30 20 10 顺序方向:L L L L L L

场景4

如果当前状态为:50 40 20 10
状态方向:L L L L

要添加的新项目:30L

预期顺序:50 40 30 20 10
顺序方向:L L L L L

场景5

如果当前状态为:50 40 20 10
状态方向:L L R R

要添加的新项目:30L

预期顺序:50 40 30 20 10
顺序方向:L L L L L

我用我的逻辑创建了一个 stackblitz,但这并不适用于所有场景。 Please check here。在 stackblitz 中,我在数据文件夹中添加了可能的数据集。 请检查 link 并帮助我使此代码适用于所有场景。
提前致谢。欢迎提出任何建议。

您可以将所有值添加到主数组并按方向和值排序。

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