【问题标题】:Array ordering logic based on another array key and direction (left or right)基于另一个数组键和方向(左或右)的数组排序逻辑
【发布时间】:2020-11-13 10:33:43
【问题描述】:

我面临一个场景,我需要根据另一个数组的索引和方向(左或右)对数组进行排序。这种排序的关键是我有一组基于数组在水平轴上排序的图表。这种水平排列基于显示历史数据的 Web 服务。同样,有一个选项可以查看以垂直(堆栈)排列的水平图表的实时值。当前的逻辑是通过迭代形成水平图表的数组来创建垂直图表。但问题是,在某些情况下,此迭代涉及另一个导致订单更改的 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

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

【问题讨论】:

  • 你只有积极的价值观吗?
  • 是的,只有正面的。它实际上是另一个数组的索引
  • @pilchard 恐怕我明白你的意思了。对我来说,这是意料之中的。你能详细说明一下吗

标签: javascript arrays tree logic direction


【解决方案1】:

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

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

【讨论】:

  • 感谢您的建议。我会尝试并更新你。
  • 有什么方法可以避免将所有值添加到主数组并排序。我的意图是将新添加的项目插入到正确的位置,而不是添加一个数组并排序。这可能吗?如果我错了,我很好奇和抱歉。最后,在我的实际用例中,我需要在 UI 中将其显示为列表。所以为此我可能需要再次迭代它。正确的?分享您的宝贵想法。
  • 感谢编辑版本。逻辑似乎有效,我想这可以添加到我的实际用例中。使用方向作为消极和积极的技巧真的很酷。它不存在于我的脑海中。感谢您的指导。
猜你喜欢
  • 2014-10-25
  • 2015-03-03
  • 2013-06-24
  • 1970-01-01
  • 2021-07-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多