Javascript 如何将数组中的多个项移动到数组中的不同索引?
我有一个包含7项的数组。我想将一些项以与原始数组中相同的顺序移动到不同的索引中。到目前为止,我已经将代码片段粘贴到了我尝试的任何东西上Javascript 如何将数组中的多个项移动到数组中的不同索引?,javascript,html,jquery,arrays,Javascript,Html,Jquery,Arrays,我有一个包含7项的数组。我想将一些项以与原始数组中相同的顺序移动到不同的索引中。到目前为止,我已经将代码片段粘贴到了我尝试的任何东西上 let originalArray=['a','b','c','d','e','f','g']; 让itemsToBeMoved=['c','f','e']; 设newIndexToBeMoved=4; //预期结果为['a'、'b'、'd'、'c'、'e'、'f'、'g']; 设movableItemsIndex=[]; 可移动项索引推送(原始数组索引('c
let originalArray=['a','b','c','d','e','f','g'];
让itemsToBeMoved=['c','f','e'];
设newIndexToBeMoved=4;
//预期结果为['a'、'b'、'd'、'c'、'e'、'f'、'g'];
设movableItemsIndex=[];
可移动项索引推送(原始数组索引('c'));
可移动项索引推送(原始数组索引('f'));
可移动项索引推送(原始数组索引('e'));
//要移动的项目必须按照原始数组进行排序
movableItemsIndex.sort();
设itemsToBeMovedSorted=[originalArray[movableItemsIndex[0]],originalArray[movableItemsIndex[1]],originalArray[movableItemsIndex[2]];
//在将项目插入到新位置之前删除项目
while(可移动项索引长度){
原始阵列拼接(movableItemsIndex.pop(),1);
}
让NewUpdateArray=[…originalArray],j=0;
for(设i=newIndexToBeMoved;i请尝试以下操作:
const originalArray=['a','b','c','d','e','f','g'];
const itemsToBeMoved=['c','f','e'];
const newIndexToBeMoved=4;
原始阵列拼接(newIndexToBeMoved、0、itemsToBeMoved)
console.log(originalArray.flat())
假设所有元素都是唯一的:
let originalArray=['a','b','c','d','e','f','g'];
让itemsToBeMoved=['c','f','e'];
设newIndexToBeMoved=4;
//查找标记插入点的元素的值
let insertBefore=originalArray[newIndexToBeMoved];
//按照原始顺序,检查拆卸过程中是否存在
//列表、*和*将它们从原始阵列中删除
让我们移动=[];
for(设i=0;i=0){
移动。推(值);
原始拼接(i,1);
}否则{
++一,;
}
}
//查找插入点的新索引
设insertionIndex=originalArray.indexOf(insertBefore);
如果(插入索引<0){
insertionIndex=原始阵列长度;
}
//并将元素添加回
原始阵列拼接(插入索引,0,…移动);
控制台日志(原始阵列)代码>这可以通过多种方式解决,但下面是一个可以完成的快速概述:
首先,您可以为要移动的项目创建一个“当前”映射(基于源数组中的位置)
现在,过滤数组,删除项目,但跟踪它们是否存在
在所需位置(基于源数组中的索引)将(已排序的)已筛选出的值拼接到已更改的数组中
const move=(arr、项目、索引)=>{
当前常量=新映射(items.Map(item=>[item,arr.indexOf(item)]);
const changed=arr.filter(item=>!present.has(item));
修改的.splice(arr.indexOf(arr[index-1]),0,…([…present.entries()]
.filter(([k,v])=>v!=-1)
.sort(([,k1],,k2])=>k1-k2)
.map(([k,v])=>k));
更改退货;
}
常量移动=移动(['a'、'b'、'c'、'd'、'e'、'f'、'g']、['c'、'f'、'e'],4);
控制台日志(已移动)代码>
.as console wrapper{top:0;max height:100%!important;}
将它们拼接出来,将它们重新拼接回来-如果要删除该索引之前的某些元素(从而更改其索引),那么是什么定义了插入索引?在搜索内容的上下文中,给出元素的值是否更有意义,在该值之后将重新插入移动的元素?问题是,因为我必须拼接必须移动的项目。原始数组中项的索引将更改。现在,我必须依次插入项目的索引在拼接后无效。您可以在我提供的代码段中看到预期结果。要移动的元素不是连续组。它们需要单独删除,但可以整体重新插入。这不会产生OP所需的输出序列。@Alnitak I必须对值进行排序并从索引中减去一,因为它们的索引似乎从1开始,而不是从0开始。感谢您的反馈。我相信索引从0开始,但它反映了原始序列中的插入点,因此最终插入点将取决于从前面的元素中删除的元素的数量。顺便说一句,您的排序依据是什么?价值观,还是它们的位置?没有评论很难判断,但如果你是按值排序,OP没有这样的要求。要求删除的元素以与原始数组相同的顺序出现,而原始数组恰好被排序。@Alnitak这是因为我使用了一个映射,但我没有保留原始索引序列,所以我认为您的响应会处理好这一点。。。我将当前地图设置为存储原始位置。这样我就可以过滤掉不存在的项目,然后再重新排序。对不起,在接受之前,我无法测试所有场景。对此我很抱歉。如果我更改itemsToBeMoved=['f','e']&newIndexToBeMoved=6;然后输出是[“e”、“f”、“a”、“b”、“c”、“d”、“g”],应该是[“a”、“b”、“c”、“d”、“g”、“e”、“f”]@SsNewbie那么您就有一个(缺乏)规范问题,因为在第一个示例中,您希望插入元素之后的d
是索引为3(零索引)的元素,而不是第四个,也就是说,您正在元素3和4之间插入g
是第六个元素。如果指定newIndexToBeMoved=7
(即g
位置后的一个),则“我的代码”将生成所需的输出。注意:代码已更新,以允许数组两端的边缘条件。@Alnatik:yes。。因此,如果(newIndexToBeMoved=6
)(最后一个索引),则必须将其设置为