Javascript 将数组中的最后一个对象推送到下一个数组
我有一个这样的物体:Javascript 将数组中的最后一个对象推送到下一个数组,javascript,arrays,angular,typescript,Javascript,Arrays,Angular,Typescript,我有一个这样的物体: container = { row1: [ '1', '2', '3', '4' ], row2: [ '5', '6', '7', '8' ], row3: [ '9', '10', '11', '12' ] } 此数据填充我的角度项目中的栅格拖放组件 当一个“项目”从一个数组移动到另一个数组时,我希望该数组中的最后一个项目移动到下一个数组,并将所有对象向前推1,以便确保每个数组中只有4个对象 我怎样才能做到这一点?我已经干了好几个小时了 我
container = {
row1: [ '1', '2', '3', '4' ],
row2: [ '5', '6', '7', '8' ],
row3: [ '9', '10', '11', '12' ]
}
此数据填充我的角度项目中的栅格拖放组件
当一个“项目”从一个数组移动到另一个数组时,我希望该数组中的最后一个项目移动到下一个数组,并将所有对象向前推1,以便确保每个数组中只有4个对象
我怎样才能做到这一点?我已经干了好几个小时了
我有一个“drop”方法,在将项添加/删除到新数组时调用该方法:
drop(event: CdkDragDrop<string[]>) {
if (event.previousContainer === event.container) {
moveItemInArray(event.container.data, event.previousIndex, event.currentIndex);
} else {
transferArrayItem(
event.previousContainer.data,
event.container.data,
event.previousIndex,
event.currentIndex);
}
}
我还可以在组件中访问此数组,因此甚至可以传入行名称:
drop(event: CdkDragDrop<string[]>, rowName: string) {
if (event.previousContainer === event.container) {
moveItemInArray(event.container.data, event.previousIndex, event.currentIndex);
} else {
transferArrayItem(
event.previousContainer.data,
event.container.data,
event.previousIndex,
event.currentIndex);
}
}
drop(事件:CdkDragDrop,行名:string){
if(event.previousContainer==event.container){
moveItemInArray(event.container.data、event.previousIndex、event.currentIndex);
}否则{
转让协议(
event.previousContainer.data,
event.container.data,
event.previousIndex,
事件(当前索引);
}
}
我怎样才能做到这一点,如果需要的话,我也很高兴能够逆转它
这里是StackBlitz:首先,您需要更新StackBlitz的引用,以获得Angular 8和cdk的新版本。删除pollyfill.ts中对core.js的引用 这使得您可以在行之间拖动 将“下降功能”更改为后,例如 之后,我们将在拖动项之前添加一个div
<div cdkDropList cdkDropListOrientation="horizontal"
[cdkDropListData]="container.row1" class="example-list"
(cdkDropListDropped)="drop($event)"
(cdkDropListEntered)="enter($event,0)" > //<--for the second row will be enter($event,1)
// and for the third row enter($event,2)
<!-- our element before the drags elements -->
<div class="example-box"
[style.display]="(indexDrag!=0 ||
indexEnter==indexDrag ||
indexEnter<0)?'none':null">
<div class="tile">
<div class="tile-container">{{fade[0]}}</div>
</div>
</div>
<!--our dragabbles elements -->
<div class="example-box" *ngFor="let item of container.row1" cdkDrag
(cdkDragStarted)="startDrag(0)"> //<--for the second row will be startDrag(1)
// and startDrag(2) for the third row
<div class="tile">
<div class="tile-container">{{item}}</div>
</div>
</div>
在div中,生成另一个*ngIf是最后一个
<div class="tile" *ngIf="!last || indexEnter!=1 || indexEnter==indexDrag">
<div class="tile-container">{{item}}</div>
</div>
{{item}}
首先,您需要更新stackblitz的参考,以获得Angular 8和cdk的新版本。删除pollyfill.ts中对core.js的引用
这使得您可以在行之间拖动
将“下降功能”更改为后,例如
之后,我们将在拖动项之前添加一个div
<div cdkDropList cdkDropListOrientation="horizontal"
[cdkDropListData]="container.row1" class="example-list"
(cdkDropListDropped)="drop($event)"
(cdkDropListEntered)="enter($event,0)" > //<--for the second row will be enter($event,1)
// and for the third row enter($event,2)
<!-- our element before the drags elements -->
<div class="example-box"
[style.display]="(indexDrag!=0 ||
indexEnter==indexDrag ||
indexEnter<0)?'none':null">
<div class="tile">
<div class="tile-container">{{fade[0]}}</div>
</div>
</div>
<!--our dragabbles elements -->
<div class="example-box" *ngFor="let item of container.row1" cdkDrag
(cdkDragStarted)="startDrag(0)"> //<--for the second row will be startDrag(1)
// and startDrag(2) for the third row
<div class="tile">
<div class="tile-container">{{item}}</div>
</div>
</div>
在div中,生成另一个*ngIf是最后一个
<div class="tile" *ngIf="!last || indexEnter!=1 || indexEnter==indexDrag">
<div class="tile-container">{{item}}</div>
</div>
{{item}}
您的内部数组是否总是4个元素大?如果从第一个数组中获取一个元素并将其扔到第二个数组中,会发生什么情况?第一个数组是否被3个元素卡住?有空白的吗?向最后一个数组中抛出一个元素怎么样?我们是否在最后得到一个新的1元素数组?最初是的,但我打算尝试将其动态化,以便您可以使用一个变量来设置它,可以是2、4或6,并设置每行上的对象数。我建议您只使用一个数组,而不是对象数组,您将计数器设置为0,然后循环遍历此数组,然后,每次计数器为4时创建一个新行,然后将计数器重置为0。这样你就不需要过滤,你可以在任何地方注入新的项目。我会为Clarity创建一个stackblitz你的内部数组总是4个元素大吗?如果从第一个数组中获取一个元素并将其扔到第二个数组中,会发生什么情况?第一个数组是否被3个元素卡住?有空白的吗?向最后一个数组中抛出一个元素怎么样?我们是否在最后得到一个新的1元素数组?最初是的,但我打算尝试将其动态化,以便您可以使用一个变量来设置它,可以是2、4或6,并设置每行上的对象数。我建议您只使用一个数组,而不是对象数组,您将计数器设置为0,然后循环遍历此数组,然后,每次计数器为4时创建一个新行,然后将计数器重置为0。这样你就不需要过滤,你可以在任何地方注入新的项目。我会为Clarity创建一个stackblitz谢谢Eliseo,这就快到了。我还想过切换位置,而不是向前推所有对象,但不幸的是,当您将鼠标悬停在容器上方放置一个项目时,它会向上移动下一个项目,然后当您放置它时,它会切换。我怎样才能避免这种情况?我更新了答案,我认为它更接近你的要求,这非常接近。我用了“unshift()”而不是“push()”,这很有效!非常感谢。我已将此标记为正确,因为它与我想要实现的目标非常接近。但是,如果您有足够的时间,我真的希望使用enter()和exited()方法,以便“items”在enter时推送,在exit时删除,以提供更好的效果。不过,感谢您的帮助,非常感谢appreciated@DBoi,考虑到更好的效果,我更新了答案。简单的想法是在每一行之前添加一个固定的元素,当我们在行之间放置时使其可见。真的,我做到了(显示:无)在opossite的情况下谢谢Eliseo,这就快到了。我还想过切换位置,而不是向前推所有对象,但不幸的是,当您将鼠标悬停在容器上方放置一个项目时,它会向上移动下一个项目,然后当您放置它时,它会切换。我怎样才能避免这种情况?我更新了答案,我认为它更接近你的要求,这非常接近。我用了“unshift()”而不是“push()”,这很有效!非常感谢。我已将此标记为正确,因为它与我想要实现的目标非常接近。但是,如果您有足够的时间,我真的希望使用enter()和exited()方法,以便“items”在enter时推送,在exit时删除,以提供更好的效果。不过,感谢您的帮助,非常感谢appreciated@DBoi,考虑到更好的效果,我更新了答案。简单的想法是在每一行之前添加一个固定的元素,当我们在行之间放置时使其可见。真的,我在opossite的情况下成功了(显示:无)
<div cdkDropList cdkDropListOrientation="horizontal"
[cdkDropListData]="container.row1" class="example-list"
(cdkDropListDropped)="drop($event)"
(cdkDropListEntered)="enter($event,0)" > //<--for the second row will be enter($event,1)
// and for the third row enter($event,2)
<!-- our element before the drags elements -->
<div class="example-box"
[style.display]="(indexDrag!=0 ||
indexEnter==indexDrag ||
indexEnter<0)?'none':null">
<div class="tile">
<div class="tile-container">{{fade[0]}}</div>
</div>
</div>
<!--our dragabbles elements -->
<div class="example-box" *ngFor="let item of container.row1" cdkDrag
(cdkDragStarted)="startDrag(0)"> //<--for the second row will be startDrag(1)
// and startDrag(2) for the third row
<div class="tile">
<div class="tile-container">{{item}}</div>
</div>
</div>
startDrag(index) {
this.indexDrag=index;
}
enter(event: CdkDragEnter<any>,index) {
this.indexEnter=index;
const data=event.container.data
this.fade[this.indexDrag]=data[data.length-1]
}
drop(event: CdkDragDrop<string[]>) {
this.indexDrag = -1;
this.indexEnter = -1;
this.fade=[" "," "," "]
...rest of the code..
}
const currentIndex=(event.currentIndex==event.container.data.length)?
event.container.data.length-1:event.currentIndex
<div class="tile" *ngIf="!last || indexEnter!=1 || indexEnter==indexDrag">
<div class="tile-container">{{item}}</div>
</div>