javascript中的排序排列

javascript中的排序排列,javascript,typescript,algorithm,Javascript,Typescript,Algorithm,我有一些对象具有这样的字段id和position const items = [{id: 11, position: 1}, {id: 12, position: 2}, {id: 13, position: 3}, {id: 14, position: 4}, {id: 15, position: 5}, {id: 16, position: 6}]; 这些项目基本上是一个叠在另一个上面的文件夹,可以相对移动这些文件夹,这意味着更改它们的位置属性 我需要这样一个函数: const moveD

我有一些对象具有这样的字段
id
position

const items = [{id: 11, position: 1}, {id: 12, position: 2}, {id: 13, position: 3}, {id: 14, position: 4}, {id: 15, position: 5}, {id: 16, position: 6}];
这些项目基本上是一个叠在另一个上面的文件夹,可以相对移动这些文件夹,这意味着更改它们的位置属性

我需要这样一个函数:

const moveDir = (idIn: number, idOut: number, currentList: Dir[]): Dir[] => {
    // some code;
    return;
}
const items = [{id: 11, position: 1}, {id: 12, position: 2}, {id: 13, position: 3}, {id: 14, position: 4}, {id: 15, position: 5}];
这将在发生更改后返回新的文件夹列表。至于
idIn
idOut
参数:我想将id为
idIn
的文件夹拖到id为
idOut
的文件夹的位置

示例:

--------
Folder 1
--------
Folder 2
--------
Folder 3
--------
Folder 4
--------
Folder 5
--------
--------
Folder 1 (id = 11, position = 1)
--------
Folder 2 (id = 12, position = 2)
--------
Folder 3 (id = 13, position = 3)
--------
Folder 4 (id = 14, position = 4)
--------
Folder 5 (id = 15, position = 5)
--------
如果
IDI=2
idOut=4
,结果应为:

--------
Folder 1
--------
Folder 3
--------
Folder 4
--------
Folder 2
--------
Folder 5
--------
--------
Folder 1
--------
Folder 4
--------
Folder 2
--------
Folder 3
--------
Folder 5
--------
--------
Folder 1 (id = 11, position = 1)
--------
Folder 3 (id = 13, position = 2)
--------
Folder 4 (id = 14, position = 3)
--------
Folder 2 (id = 12, position = 4)
--------
Folder 5 (id = 15, position = 5)
--------
如果
IDI=4
idOut=2
,结果应为:

--------
Folder 1
--------
Folder 3
--------
Folder 4
--------
Folder 2
--------
Folder 5
--------
--------
Folder 1
--------
Folder 4
--------
Folder 2
--------
Folder 3
--------
Folder 5
--------
--------
Folder 1 (id = 11, position = 1)
--------
Folder 3 (id = 13, position = 2)
--------
Folder 4 (id = 14, position = 3)
--------
Folder 2 (id = 12, position = 4)
--------
Folder 5 (id = 15, position = 5)
--------
任何关于如何实施这种行为的想法都会有所帮助

编辑:

对象的初始列表如下所示:

const moveDir = (idIn: number, idOut: number, currentList: Dir[]): Dir[] => {
    // some code;
    return;
}
const items = [{id: 11, position: 1}, {id: 12, position: 2}, {id: 13, position: 3}, {id: 14, position: 4}, {id: 15, position: 5}];
我知道项目ID,如果我想更改其中两个项目,我应该能够将这些项目的ID传递给我想更改的位置

编辑的示例:

--------
Folder 1
--------
Folder 2
--------
Folder 3
--------
Folder 4
--------
Folder 5
--------
--------
Folder 1 (id = 11, position = 1)
--------
Folder 2 (id = 12, position = 2)
--------
Folder 3 (id = 13, position = 3)
--------
Folder 4 (id = 14, position = 4)
--------
Folder 5 (id = 15, position = 5)
--------
如果我更改文件夹2和文件夹4,则表示
idIn=12
idOut=14

结果应该是:

--------
Folder 1
--------
Folder 3
--------
Folder 4
--------
Folder 2
--------
Folder 5
--------
--------
Folder 1
--------
Folder 4
--------
Folder 2
--------
Folder 3
--------
Folder 5
--------
--------
Folder 1 (id = 11, position = 1)
--------
Folder 3 (id = 13, position = 2)
--------
Folder 4 (id = 14, position = 3)
--------
Folder 2 (id = 12, position = 4)
--------
Folder 5 (id = 15, position = 5)
--------
这就是函数应该返回的列表(按位置排序):


我的解决方案就是纯javascript。但由于typescript最终将被编译成javascript,所以只需稍加修改即可工作。我不确定这是否是最好的方法,但它确实有效:

const项=[
{id:11,位置:1},
{id:12,位置:2},
{id:13,位置:3},
{id:14,位置:4},
{id:15,位置:5},
{id:16,位置:6}
];
const moveDir=函数(idIn、idOut、currentList){
const list=[…currentList];//克隆,我们不希望编辑原始数组
const copyEl=list[idIn-1];
list.splice(idOut,0,copyEl);//在索引idOut处插入要复制的文件夹
//我们必须在这里改变删除索引
//因为当我们在复制的元素之前添加一个元素时,索引会上升1,否则它会保持不变
常数deleteIndex=idIn>idOut?idIn:idIn-1;
拼接列表(删除索引,1);
退货清单;
}
const result=moveDir(2,4,项);
const result2=moveDir(4,2,项);
console.log('result',result);
console.log('result2',result2)

添加了javascript代码(虽然不是最干净的实现)。在正确位置插入所需对象后,我也在更新所有其他位置

const moveDir=(idIn、idOut、currentList)=>{
如果(idIn==idOut)
返回当前列表;
let list=JSON.parse(JSON.stringify(currentList));
const find1=list.find((obj)=>obj.position==idIn);
列表=列表过滤器(功能(obj){
返回对象位置!=idIn;
});
find1.position=idOut;
拼接列表(idOut-1,0,find1);
list.forEach(函数(obj,索引){
如果(idIn>idOut){
如果(索引>=idOut&&index=idIn-1&&indexx.id==12);
const index2=items.findIndex(x=>x.id==14);
const result1=moveDir(index1+1,index2+1,项);
const result2=moveDir(index2+1,index1+1,项);
log(“result1是”+JSON.stringify(result1));
log(“result2是”+JSON.stringify(result2))

以下是我的实现(虽然不是最干净的):


顺便说一句,您的样本缺少文件夹6,并且您的ID具有相同的值,这很奇怪。@F.Müller哦,天哪……这是一个打字错误……是的,这正是我所怀疑的。我只是在查看结果时注意到了这一点,并认为我犯了一个错误。哈哈是的,对不起,我的错…顺便说一下,我刚刚运行了一些测试,但是当您设置
idIn=4
idOut=2
时,会发生一些奇怪的事情,也就是说,当我们将第四个文件夹拖动到第二个文件夹的位置时。请你检查一下好吗?你说得对。那是一只虫子。我修复了它。我不知道发生了什么:))也许是我的错,我在解释问题时不够清楚……看,比方说
idIn=2
idOut=4
,基本上这意味着我们正在将第二个文件夹移动到第四个文件夹的位置。对于上面选择的计数,这意味着我们正在将id为12的文件夹移动到id为14的文件夹所在的位置。在这种情况下,结果(按位置排序)应该是:
[{id:11,位置:1},{id:13,位置:2},{id:14,位置:3},{id:12,位置:4},{id:15,位置:5},{id:16,位置:6}]
文件夹1,2,3,4,5只是名称,它们可以是任何东西,与数字无关。我只是决定用数字来命名它们,因为它似乎更容易解释我需要什么。@Albert好的,那么顺序是正确的,但是位置属性也需要更新。我能做到。但是你为什么需要这些信息呢?你已经知道->数组的顺序是正确的,它暗示了位置,除非位置对你有不同的意义。天哪…我在一天结束时变傻了,把一切都弄糊涂了…部分原因是我复制粘贴了课程中的一段代码,其余的只是在网站上键入,结果混淆了…我回到了这个问题上,看了一下代码,意识到我解释错了,
idIn
idOut
应该是文件夹ID,即no