基于另一个数组键和方向(左或右)的数组排序逻辑
Array ordering logic based on another array key and direction (left or right)
我面临这样一种情况,我需要根据另一个数组的索引和方向(左或右)对一个数组进行排序。这种排序的关键是我有一组基于数组的水平轴排序的图表。这种水平排列基于显示历史数据的网络服务。同样,有一个选项可以查看排列为垂直(堆栈)的水平图表的实时值。当前的逻辑是通过迭代形成水平图表的数组来创建垂直图表。但问题是,在某些情况下,此迭代涉及另一个导致订单更改的 web 服务调用。结果水平顺序与垂直顺序不匹配。
如附图所示。Array Order Logic。在图表容器中,图表按顺序排列,并根据其方向排列。
图表容器中的排列逻辑:
当图表容器为空时
项目 A 方向 左
输出:A(L)
项目 B 方向 左
输出:B(L) A(L)
项目 C 方向 右
输出:B(L) A(L) C(R)
等..
图表列表中的预期排列逻辑
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
我面临这样一种情况,我需要根据另一个数组的索引和方向(左或右)对一个数组进行排序。这种排序的关键是我有一组基于数组的水平轴排序的图表。这种水平排列基于显示历史数据的网络服务。同样,有一个选项可以查看排列为垂直(堆栈)的水平图表的实时值。当前的逻辑是通过迭代形成水平图表的数组来创建垂直图表。但问题是,在某些情况下,此迭代涉及另一个导致订单更改的 web 服务调用。结果水平顺序与垂直顺序不匹配。
如附图所示。Array Order Logic。在图表容器中,图表按顺序排列,并根据其方向排列。
图表容器中的排列逻辑:
当图表容器为空时
项目 A 方向 左
输出:A(L)
项目 B 方向 左
输出:B(L) A(L) 项目 C 方向 右
输出:B(L) A(L) C(R) 等..图表列表中的预期排列逻辑
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