我有一个数组列表,其中相同的项目可能出现在不同的列表中(但不会出现在同一个列表中)。
我试图对这些数组进行排序,以便匹配的项目在所有数组中具有相同的索引。
我还尽量填补空缺位置,但如果某些位置保持未定义也是可以的。
用途
这是为了管理日历中每天事件的用户界面。
在我的情况下,
myWrapper
是一个星期,其中每个位置是一天。里面的每个数组都是当天可能发生的事件的列表。由于一个事件可能跨越多天(假设一个全天事件持续2天的简单情况),我们需要该事件出现在相同的位置,以便与前一天连续地呈现。
虽然它并不真正可见,但它成为一个占位符,前一天的块将变为两倍长。
条件
- 所有的重复元素都是连续的,所以如果一个元素是重复的,那么在前一个数组中肯定有一份副本。
- 每个项目在每个数组中只能出现一次(重复项只存在于不同的数组中)。
- foo 数组的长度可能不同。
- foo 数组始终存在,最坏情况下为空。
- foo 数组中的顺序不重要,只要达到目标即可。
- 包装数组不能排序。
输入
const myWrapper [
{ foo: [] },
{ foo: ['A', 'B', 'C', 'D'] },
{ foo: ['X', 'A', 'E', 'C'] },
{ foo: ['X', 'F', 'C', 'G', 'H'] },
{ foo: ['C'] }
];
期望的输出
const myWrapper [
{ foo: [] },
{ foo: ['B', 'A', 'C', 'D'] },
{ foo: ['X', 'A', 'C', 'E'] },
{ foo: ['X', 'F', 'C', 'G', 'H'] },
{ foo: [undefined, undefined, 'C'] }
];
有没有一种简洁的方法来实现这个?
我尝试了一种方法,从右边开始排序,并使用一个临时变量来交换项目。但是有时候这并不好用,因为下一个位置有时会移动前面的项目,从而干扰了上一次迭代中设置的顺序。
let tmp;
myWrapper.forEach((item, wrapperIndex) => {
item.foo.forEach((currentFoo, fooIndex) => {
// Search for match in the previous foo
if(myWrapper[wrapperIndex - 1]) {
const prevFoo = myWrapper[wrapperIndex - 1].foo;
const prevIndex = prevFoo.indexOf(item);
if (prevIndex >= 0 && prevIndex !== fooIndex) {
tmp = prevFoo[fooIndex];
prevFoo[fooIndex] = prevEvents[prevIndex];
prevFoo[prevIndex] = tmp;
}
}
});
});
编辑:问题还在于循环对单个项(实际上是对象,我使用字符串进行简化)进行其他操作,因此无法从右侧移动(当前项)。
输出通过Angular使用2个嵌套的*ngFor进行渲染,因此最终结果必须保持此数组结构。
[ 'D', 'A', 'C', 'B']
吗? - Isac