4273

我正在寻找JavaScript数组插入方法,其风格如下:

arr.insert(索引,项)

最好是在jQuery中,但此时任何JavaScript实现都可以。

4
  • 155
    请注意,JQuery是一个DOM和事件操作库,而不是自己的语言。它与数组操作无关。 评论 2015年2月18日15:36
  • 36
    api.jquery.com/jquery.inArray与DOM或事件无关。jQuery已经发展成为一个用于浏览器内JS开发的混合工具包,这使得人们期望它有一个用于所有事情的方法。
    – 提姆
    评论 2016年4月14日8:14
  • 8
    @Tim,但它仍然不是一种自己的语言(SO上仍然有一些问题,比如“如何在jQuery中对两个数字求和”)
    – 胜利者
    评论 2018年5月7日13:31
  • 10
    @Victor不,永远不会。jQuery很有用,也很相关,但它有它的一天。
    – 提姆
    评论 2018年5月8日6:17

34个答案34

重置为默认值
6756

你想要剪接函数。

arr.splice(索引,0,项);将插入项目进入之内阿珥在指定的指数(删除0项目优先,也就是说,它只是一个插入)。

在本例中,我们将创建一个数组,并将元素添加到索引2中:

var arr=[];arr[0]=“贾尼”;arr[1]=“Hege”;arr[2]=“过时”;arr[3]=“Kai Jim”;arr[4]=“博尔赫”;console.log(arr.join());//Jani、Hege、Stale、Kai Jim、Borge棱镜拼接(2,0,“Lene”);console.log(arr.join());//贾尼、海格、莱恩、斯塔尔、凯·吉姆、博尔格

更新(2024年5月24日)

您现在可以使用到拼接方法,其行为与剪接但是,它返回一个新数组,而不改变现有数组。

您可以更新前面的示例,如下所示:

const updated=arr.toSpliced(2,0,“Lene”);
18
  • 266
    谢谢,我原以为我会觉得问这个问题很愚蠢,但现在我知道答案了,我不知道!为什么他们决定称之为splice,而同一个功能通常使用一个更容易搜索的术语?!
    – 标签2k
    评论 2009年2月25日14:46
  • 109
    @tags2k:因为函数不仅仅是插入项目,而且它的名称已经在perl中建立了? 评论 2009年2月25日14:53
  • 18
    文件:developer.mozilla.org/en/JavaScript/Guide/…
    – 丁戈
    评论 2011年3月10日9:54
  • 76
    剪接可以插入,但同样频繁不会例如:棱缝(2,3)将从索引2开始删除3个元素。不通过第三。。。。第N个参数未插入任何内容。所以这个名字插入()这也不公平。 评论 2014年5月13日1:45
  • 23
    我认为“拼接”一词很有意义。拼接意味着连接或连接,也意味着改变。您已经建立了一个数组,现在您正在“更改”它将涉及添加或删除元素。您可以指定数组中的起始位置,然后指定要删除的旧项数量(如果有),最后还可以指定要添加的新元素列表。当然,拼接也是一个很棒的科幻术语。 评论 2014年11月21日15:45
424

您可以实施阵列插入方法:

Array.prototype.insert=函数(索引,…项){this.splice(索引,0,…项);};

然后你可以像这样使用它:

var arr=['A','B','E'];arr.insert(2,“C”,“D”);//=>arr==[“A”、“B”、“C”、“D”、“E”]
11
  • 18
    要插入多个可以使用的项目Array.prototype.insert=函数(索引,项){this.splice.apply(this,[index,0].concat(项));} 评论 2014年5月30日12:15
  • 11
    向数组中添加内容的问题是,当您执行for(i in arr){…}时,函数将显示为元素 评论 2014年7月2日9:38
  • 27
    但请记住,不建议扩展本机类型,因为它可能会干扰其他代码或未来的功能。
    – 火星人
    评论 2018年8月21日9:48
  • 104
    不要修改您不拥有的对象 评论 2019年2月19日18:09
  • 41
    不要修改原型 评论 2019年5月31日12:54
307

除了拼接之外,您还可以使用这种方法,它不会改变原始数组,但会使用添加的项创建一个新数组。当你需要避免突变时,它很有用。我正在使用欧洲标准6此处为扩展运算符。

常量项=[1,2,3,4,5]常量插入=(arr,index,newItem)=>[//指定索引之前的数组的一部分…arr.slice(0,索引),//插入的项目新项目,//指定索引后数组的一部分…arr.slice(索引)]const结果=插入(项,1,10)console.log(结果)// [1, 10, 2, 3, 4, 5]

这可以用于添加多个项目,方法是稍稍调整函数以对新项目使用rest操作符,并在返回的结果中传播该操作符:

常量项=[1,2,3,4,5]常量插入=(arr,index,…newItems)=>[//指定索引之前的数组的一部分…arr.slice(0,索引),//插入的项目…新项目,//指定索引后数组的一部分…arr.slice(索引)]常量结果=插入(项,1,10,20)console.log(结果)// [1, 10, 20, 2, 3, 4, 5]

6
  • 4
    这是一种好的、安全的方法吗?我之所以这样问,是因为这看起来如此优雅简洁,但没有其他答案涉及到这一点。他们中的大多数修改了原型对象! 评论 2017年12月11日9:32
  • 11
    @HarshKanchina这可能是因为大多数答案都是ES6之前的,但从我的经验来看,这种方法现在很常见
    – 盖菲
    评论 2017年12月16日22:35
  • 2
    这种方法总是比拼接更慢、更糟糕。不要被漂亮的甜言蜜语语法或在其他被误导的开发人员中的受欢迎程度所愚弄(*咳嗽*卡扎菲*咳嗽*)。分配一个全新的数组并丢弃旧数组比修改原始数组要慢得多。如果你需要副本,请致电切片()之前拼接()。不要将ES6用于这些琐碎的事情,使用其他API可以做得更好、更干净。 评论 2021年1月19日2:19
  • 5
    你应该解释为什么你应该避免变异。它慢吗?如果是,速度慢多少?这值得额外的“麻烦”吗? 评论 2021年5月25日9:34
  • 5
    @JackG别忘了切片()将分配一个新的数组,拼接()分配一个新的数组,因为它返回一个被删除的项的数组(在这种情况下是一个空数组)。在这些情况下运行基准测试表明,拼接速度更快(约30%),但我们每秒可以进行数百万次操作,因此除非您的应用程序正在执行许多在这些紧密循环的操作中,它不会产生任何影响。
    – 刻痕
    评论 2021年9月22日9:00
94

使用阵列.原型.拼接()是一种优雅的实现方式

常数=['one','two','four','five']编号。拼接(2,0,‘三’);console.log(数字)

阅读更多关于阵列.原型.拼接

1
  • 1
    如上所述,使用prototype将向数组中添加一个额外的项,因此之后循环将无法按预期工作。 评论 2023年8月29日17:11
90

自定义数组插入方法

1.具有多个参数和链接支持

/*语法:array.insert(索引,值1,值2,…,值N)*/Array.prototype.insert=函数(索引){this.splice.apply(this,[索引,0].concat(Array.prototype.slice.call(参数,1));返回此;};

它可以插入多个元素(作为本机元素剪接does)并支持链接:

[“a”、“b”、“c”、“d”].插入(2,“X”、“Y”、“Z”).切片(1,6);//[“b”、“X”、“Y”、“Z”、“c”]

2.具有数组类型参数合并和链接支持

/*语法:数组.insert(索引,值1,值2,…,值N)*/Array.prototype.insert=函数(索引){index=Math.min(index,this.length);arguments.length>1&&this.splice.apply(this,[index,0].concat([].pop.call(arguments))&&this.insert.apply(this,参数);返回此;};

它可以将参数中的数组与给定数组合并,还支持链接:

[“a”,“b”,“c”,“d”].插入(2,“V”,[“W”,“X”,“Y”],“Z”).连接(“-”);//“a-b-V-W-X-Y-Z-c-d”

演示: http://jsfiddle.net/UPphH/

9
  • 当这个版本在参数中找到一个数组时,是否有一种简洁的方法让它也合并一个数组?
    – 诺洛
    评论 2013年3月30日23:56
  • 我不明白第一个结果[“b”、“X”、“Y”、“Z”、“c”]。为什么不是“d”包括?在我看来,如果你把6作为切片()从指定的索引开始,数组中有6个元素,然后应该在返回值中获得所有6个元素。(医生说有多少用于该参数。)developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/… 评论 2014年12月12日2:03
  • 实际上,如果我使用的索引为3或更多,则在输出中什么也得不到(情况1.,FireFox)[“a”、“b”、“c”、“d”].插入(2,“X”、“Y”、“Z”).切片(3,3);=>[ ] 评论 2014年12月12日2:08
  • @AlexisWilke在我使用的第一个示例中方法而不是剪接你在评论中提到的。的第二个参数(已命名结束)是结束提取的基于零的索引。摘录达但不包括结束因此,在插入你有[“a”、“b”、“X”、“Y”、“Z”、“c”、“d”],从中从中提取具有索引的元素1高达6,即来自“b”“d”但不包括“d”。这有道理吗?
    – 愿景
    评论 2014年12月12日8:46
  • 由于某种原因,当我使用insert2时,我得到一个“Expected 1 argument,but got 2”异常。 评论 2020年6月26日3:08
56

如果您想一次将多个元素插入数组,请查看此堆栈溢出答案:用javascript将数组拼接成数组的更好方法

这里还有一些函数来说明这两个示例:

函数insertAt(数组,索引){var arrayToInsert=Array.prototype.splice.apply(参数,[2]);return insertArrayAt(数组,索引,arrayToInsert);}函数insertArrayAt(数组,索引,arrayToInsert){Array.prototype.splice.apply(Array,[index,0].concat(arrayToInsert));返回数组;}

最后是一个jsFiddle,您可以自己查看它:http://jsfiddle.net/luisperezphd/Wc8aS/

以下是您如何使用这些功能:

//如果要插入特定值,无论是常量还是变量:插入At(arr,1,“x”,“y”,“z”);//或者,如果您有一个数组:var arrToInsert=[“x”,“y”,“z”];插入数组位置(arr,1,arrToInsert);
4
  • 2
    在insertAt()创建了一个单一元素arrayToInsert后,调用insertArrayAt(()不是更好吗?这样可以避免重复相同的代码。 评论 2012年9月10日16:12
  • 1
    这是一个很好的例子,说明何时使用“apply” 评论 2015年1月29日0:44
  • 我向该方法中添加了一个removeCount参数,以利用splice也可以删除该索引中的项的能力:Array.prototype.splice.apply(Array,[index,removeCount||0].concat(arrayToInsert)); 评论 2015年1月29日0:56
  • 谢谢,我用它qml(平方米)
    – S在
    评论 2022年8月1日15:03
47

解决方案和性能

今天(2020.04.24),我为大小阵列的选定解决方案执行测试。我测试了它们macOS v10.13.6版本Chrome 81.0、Safari 13.1和Firefox 75.0上的(High Sierra)。

结论

适用于所有浏览器

  • 令人惊讶的是,对于小型阵列,基于减少(D、E、F)通常比就地解决方案快10x100倍
  • 对于大型阵列,基于剪接(AI、BI和CI)速度最快(有时约为100倍,但这取决于阵列大小)
  • 对于小型阵列,BI解决方案最慢
  • 对于大型阵列,E解决方案最慢

在此处输入图像描述

细节

试验分为两组:原位溶液(AI、BI和CI)和非塑性溶液(D、E和F),并针对两种情况进行:

  • 测试一个包含10个元素的数组-您可以运行它在这里
  • 测试包含1000000个元素的数组-您可以运行它在这里

测试代码显示在以下代码片段中:

J小提琴

函数AI(arr,i,el){arr.splice(i,0,el);返回arr;}功能BI(arr,i,el){阵列.原型.拼接.应用(arr,[i,0,el]);返回arr;}功能CI(arr,i,el){数组.原型.拼接.调用(arr,i,0,el);返回arr;}函数D(arr,i,el){返回arr.slice(0,i).concat(el,arr.slices(i));}函数E(arr,i,el){return[…arr.slice(0,i),el,…arr.scice(i)]}函数F(arr,i,el){return arr.reduce((s,a,j)=>(j-i?s.push(a):s.push(el,a),s),[]);}// -------------//测试// -------------设arr=[“a”,“b”,“c”,“d”,“e”,“f”];设log=(n,f)=>{设a=f([…arr],3,“新”);控制台.log(`${n}:[${a}]`);};log('AI',AI);日志(“BI”,BI);log(“CI”,CI);对数('D',D);对数(‘E’,E);对数('F',F);
此代码段仅显示测试过的代码(不执行测试)

Google Chrome上一个小数组的示例结果如下:

在此处输入图像描述

  • 4
    答案没有解决OP的问题。 评论 2020年9月12日5:52
  • 27
    @实际上,在这个答案中,你可以找到许多OP问题的解决方案,但这个答案的附加价值在于它们之间的性能比较——我希望许多人会发现它很有用 评论 2020年9月12日7:24
  • 也许,您可能想重新组织一下您的答案,以便用户能够直观地首先看到可能的解决方案及其对性能的影响。它看起来主要关注性能rn。 评论 2020年9月12日7:46
47

你可以使用拼接()为此

这个拼接()方法在添加元素时通常会收到三个参数:

  1. 这个指数要添加项的数组的
  2. 这个要删除的项目数,在本例中是0
  3. 这个要素添加

let数组=['项1','项2','项3']让insertAtIndex=0let itemsToRemove=0array.splice(insertAtIndex,itemsToRemove,'在索引0处插入此字符串')console.log(数组)

  • 2
    请下次阅读答案时,这个答案已经给出了。你只是在重复信息。 评论 2022年5月31日9:57
  • 7
    @当我发布这个答案时,我认为其他答案可以更好地解释。投票数量的增加清楚地表明,这个答案对一些人来说是有用的。
    – 气体
    评论 2022年5月31日11:31
  • 是的,解释第二个参数的含义特别有用 评论 2022年9月23日5:01
40

为了正确的函数编程和链接目的Array.prototype.insert()至关重要。实际上剪接如果它返回的是变异数组,而不是一个完全没有意义的空数组,那么可能会很完美。所以它是这样的:

Array.prototype.insert=函数(i,…rest){此.拼接(i,0,…其余)把这个还给我}变量a=[3,4,8,9];document.write(“<pre>”+JSON.stringify(a.insert(2,5,6,7))+“</pre>”);

好吧,以上是数组.原型.拼接()有人改变了原始数组,有些人可能会抱怨说“你不应该修改不属于你的东西”,这可能也是正确的。所以为了公共福利,我想再给一个Array.prototype.insert()它不会改变原始数组。就这样;

Array.prototype.insert=函数(i,…rest){返回this.slice(0,i).concat(rest,this.slie(i));}变量a=[3,4,8,9],b=a.insert(2,5,6,7);console.log(JSON.stringify(a));console.log(JSON.stringify(b));

4
  • 4
    “一个完全没有意义的空数组”-当第二个参数为0时,它只返回一个空数组。如果大于0,则返回从数组中删除的项。考虑到您要添加到原型中,并且剪接改变原始数组,我认为“适当的函数编程”不属于剪接. 评论 2016年5月22日21:15
  • 我们在这里讨论的是insert,Array.prototype.splice()的第二个参数必须为零。它返回的内容除了“我没有删除任何内容”之外没有其他意义,因为我们使用它来插入项目,所以我们已经有了这些信息。如果您不想改变原始数组,那么可以使用两个array.prototype.slice()和一个Arrary.protocol.concat()操作进行同样的操作。这取决于你。
    – 雷杜
    评论 2016年5月22日21:23
  • 1
    您的第二个实现是整个页面中最干净的,您没有投票权。请接受我的,继续做好工作。(你应该避免改变原型,但你已经知道了) 评论 2016年6月2日14:18
  • 1
    我认为值得一提的是,其余参数是新的ECMA第6个参数(developer.mozilla.org/en/docs/Web/JavaScript/Reference/…) 评论 2016年12月9日17:02
33

我建议使用纯JavaScript脚本在这种情况下。JavaScript中也没有任何插入方法,但我们有一个方法内置数组为您完成工作的方法。它被称为剪接...

让我们看看是什么拼接()...

方法通过删除现有元素和/或添加新元素。

好的,假设下面有一个数组:

常数arr=[1,2,3,4,5];

我们可以删除这样地:

arr.plice(arr.indexOf(3),1);

它将返回3,但如果我们现在检查arr,我们有:

[1, 2, 4, 5]

到目前为止,还不错,但我们如何使用splice向数组添加新元素呢?

让我们把3放回arr。。。

棱缝(2,0,3);

让我们看看我们做了什么。。。

我们使用剪接再一次,但这次对于第二个参数,我们通过了0,意味着我们不想删除任何项,但同时,我们添加了第三个参数,即将在第二个索引处添加的3。。。

你应该意识到我们可以删除添加同时。例如,现在我们可以:

棱缝(2、2、3);

这将删除两个项目位于索引2。然后添加在索引2处,结果为:

[1, 2, 3, 5];

这显示了每个项目如何剪接工作:

数组.splice(start,deleteCount,item1,item2,item3…)

1
  • 2
    感谢您以后解释,我建议使用非数字作为数组值,以显示一个示例。例如:arr.splice(2,0,3)与arr.splite(2,0,“C”)。读者更容易理解哪个参数映射到值部分,哪个映射到索引部分。谢谢您! 评论 2020年10月9日14:47
24

以下是两种方法:

const数组=['My','name','Hamza'];array.splice(2,0,'is');console.log(“方法1:”,array.join(“”));

或者

Array.prototype.insert=函数(索引,项){this.splice(索引,0,项);};const数组=['My','name','Hamza'];array.insert(2,'is');console.log(“方法2:”,array.join(“”));

23

在特定索引处追加单个元素:

//附加到特定位置(此处为索引1)arrName.拼接(1,0,'newName1');//1:索引编号,0:要删除的元素编号,newName1:新元素//附加到特定位置(此处为索引3)arrName[3]='newName1';

在特定索引处附加多个元素:

//从索引编号1追加arrName.splice(1,0,‘newElemenet1’,‘newElemenet2’,‘newElemenet3’);//1:从追加开始的索引编号,//0:要删除的元素数,//newElemenet1,2,3:新元素
7
  • 11
    值得注意的是,arrName[3]没有附加,它重写了。 评论 2018年9月10日22:40
  • 它将元素添加到现有数组中,而不是过度使用,例如:let arrName=['xxx','yyy','zzz'];arrName.拼接(1,0,'aaa','bbb','ccc');打印arrName之后 评论 2018年9月12日18:49
  • 如果arrName有3个以上的元素,则覆盖第3个,而不是追加。还是我看错了? 评论 2018年9月12日18:51
  • 如果我们在中间插入一个元素,它会移动下一个元素而不是覆盖。请详细说明你的问题,你需要什么。以一个数组(示例)和输出中需要的内容为例。请评论我 评论 2018年9月12日18:56
  • 2
    @斯里克鲁什纳arrName[3]='newName1';如果数组只有3个元素,将追加。如果索引3中有元素,则将替换该元素。如果要在末尾追加,最好使用arrName.push('newName1');
    – 敬畏
    评论 2019年11月14日8:24
17

阵列#拼接()这就是方法,除非您真的想避免改变数组。给定2个阵列arr1型棱2,下面是如何插入的内容棱2进入之内arr1型在第一个元素之后:

const arr1=[‘a’,‘d’,‘e’];const arr2=['b','c'];arr1.拼接(1,0,…arr2);//arr1现在包含['a','b','c','d','e']控制台.log(arr1)

如果您担心改变数组(例如,如果使用Immutable.js),您可以使用切片(),不要混淆拼接()用一个“p”.

const arr3=[…arr1.切片(0,1),…arr2,…arr 1.切片(1)];
15

另一种可能的解决方案,使用阵列减少.

const arr=[“苹果”,“桔子”,“覆盆子”];常数arr2=[1,2,4];常量插入=(arr,item,index)=>arr.reduce(函数(s,a,i){i===指数?s.push(项目,a):s.push;返回s;}, []);控制台.log(插入(arr,“香蕉”,1));控制台.log(插入(arr2、3、2))

10

尽管这个问题已经得到了回答,但我还是添加了这个注释,作为一种替代方法。

我想放置一个已知数字项从“关联数组”(即对象)中分离出来,根据定义,该数组不能保证按排序顺序排列。我希望得到的数组是一个对象数组,但对象在数组中的顺序是特定的,因为数组保证了它们的顺序。所以我做到了。

首先是源对象JSONB格式从PostgreSQL检索的字符串。我想让它按每个子对象中的“order”属性排序。

var jsonb_str='{“one”:{“abbr”:“”,“order”:3},“two”:{abbr:“”;var jsonb_obj=JSON.parse(jsonb_str);

由于对象中的节点数已知,我首先创建一个具有指定长度的数组:

var obj_length=对象.keys(jsonb_obj).length;var sorted_array=新数组(obj_length);

然后迭代该对象,将新创建的临时对象放置到数组中所需的位置,而不进行任何“排序”。

for(Object.keys(jsonb_obj)的var键){变量tobj={};tobj[key]=jsonb_obj[key]。abbr;var位置=jsonb_obj[key].order-1;sorted_array[position]=待定;}控制台.dir(sorted_array);
0
10

不可变插入

使用剪接如果您需要就地插入数组,那么方法无疑是最佳解决方案。

但是,如果您正在寻找一个不可变函数,该函数返回一个新的更新数组,而不是在插入时改变原始数组,那么可以使用以下函数。

函数插入(数组、索引){const items=Array.prototype.slice.call(参数,2);return[].concat(array.slice(0,index),items,array.slice(index));}常量列表=['one','two','three'];const list1=插入(list,0,'zero');//插入单个项目const list2=插入(list,3,'four','five','sive');//插入多个console.log('原始列表:',list);console.log('插入的列表1:',列表1);console.log('插入的列表2:',列表2);

注:这是一个pre-欧洲标准6这样做的方式,所以它既适用于旧的浏览器,也适用于新的浏览器。

如果你正在使用ES6,那么你可以试试rest参数同样;看见这个答案.

8

任何对这个问题仍有疑问的人,都尝试过前面答案中的所有选项,但都没有得到。我分享我的解决方案,这是为了考虑到你不想显式地声明对象与数组的属性。

功能相同(左、右){return JSON.stringify(左)===JSON.stringify(右);}函数包含(数组,obj){设count=0;array.map((cur)=>{if(this.isIdentive(cur,obj))计数++;});返回计数>0;}

这是对引用数组进行迭代,并将其与要检查的对象进行比较,将两者转换为字符串,然后在匹配时进行迭代的组合。然后你就可以数数了。这可以改进,但这是我解决的地方。

8

从中获利减少方法如下:

函数插入(arr、val、index){返回索引>=arr.length? arr.concat(有效值):arr.reduce((prev,x,i)=>prev.concat(i===索引?[val,x]:x),[]);}

因此,通过这种方式,我们可以返回一个新数组(这将是一种很酷的功能性方法,比使用剪接)在索引处插入元素,如果索引大于数组的长度,则将在末尾插入。

7

我试过了,效果很好!

var initialArr=[“印度”,“中国”,“日本”,“美国”];缩写Arr.拼接(索引,0,项);

索引是要插入或删除元素的位置。

0,即第二个参数,定义要删除的索引中的元素数。项目包含要在数组中创建的新条目。它可以是一个,也可以是多个。

缩写Arr.拼接(2,0,“尼日利亚”);缩写Arr.splice(2,0,“澳大利亚”,“英国”);
1
  • 4
    只需复制粘贴上面的答案。这并没有给这个问题增加任何价值。要么添加新答案,要么对现有答案进行评论。请尝试贡献一些新的东西。我们不想破坏这个社区 评论 2017年10月24日6:50
6

我不得不同意Redu的回答,因为splice()的接口确实有点混乱。cdbajorin给出的响应是“当第二个参数为0时,它只返回一个空数组。如果它大于0,则返回从数组中删除的项“虽然准确,但证明了这一点。

该功能的目的是拼接,或如雅各布·凯勒(Jakob Keller)早些时候所说,“加入或连接,也就是改变。

您有一个已建立的数组,您现在正在更改它,这将涉及添加或删除元素。。。。“考虑到这一点,被删除的元素(如果有的话)的返回值充其量是尴尬的。我100%同意,如果这个方法返回看起来很自然的新数组,并添加了拼接元素,那么它本可以更适合链接。然后你可以做类似[”“19”“,”“17”“].splice(1,0,”“18”“).join(”“…”“)的事情。”或者使用返回的数组执行任何操作。

它会返回删除的内容,这简直是胡说八道。如果该方法的目的是“删除一组元素”,那么这可能是它的唯一目的。似乎如果我不知道我已经删掉了什么,我可能没有什么理由删掉这些元素,不是吗?

如果它的行为类似于concat()、map(),reduce()、slice()等,则会更好,其中新数组是从现有数组生成的,而不是对现有数组进行更改。这些都是可以链接的,而且一个重大问题。链式数组操作很常见。

语言似乎需要朝着一个或另一个方向发展,并尽可能地坚持下去。JavaScript的功能性和较少声明性,似乎与规范有着奇怪的偏差。

6

可以使用array.splice执行此操作:

/***@param arr:数组*@param item:要插入的项*@param index:要插入的索引*@返回带有插入元素的数组*/导出函数_arrayInsertAt<T>(arr:T[],项:T,索引:数字){返回arr.splice(索引,0,项);;}

阵列文件切片

5

这是我在一个应用程序中使用的一个工作函数。

这将检查项目是否存在:

让ifExist=(item,strings=[“”],position=0)=>{//输出到带有空字符串的数组中。重要的是以防它们不是任何项。让输出=[“”];//检查要定位的项目是否存在。if(项目){//输出应等于字符串数组。输出=字符串;//使用splice()可以断开数组。//使用位置参数来说明放置项目的位置//0表示不替换索引。物品是我们放置在指定位置的实际物品。输出。拼接(位置,0,项);}//空字符串是为了不与逗号或其他任何东西连接。返回output.join(“”);};

然后我在下面这样称呼它。

ifExist(“好友”,['(',')'],1)}//输出:(好友)ifExist(“friends”,['-'],1)}//输出:-friendsifExist(“好友”,[':'],0)}//输出:好友:
1
  • 你能解释一下你的解决方案吗? 评论 2022年9月12日10:13
5

我喜欢一点安全感,我使用这个:

阵列原型。插入=函数(项,前面){if(!item)返回;if(before==null||before<0||bevere>this.length-1){this.push(项目);回报;}this.splice(前,0,项);}var t=[“a”,“b”]t.插入(“v”,1)控制台.log(t)

2

如果要保持原始数组不变,但返回一个新数组,其中元素插入到特定索引中,则可以使用.to拼接()方法:

这样可以避免改变数组到位:

//                0    1    2常量字母=[“A”、“B”、“D”];const insertIndex=2;//数组中要插入的位置const correctLetters=字母.to拼接(insertIndex,0,“C”);//0表示不删除任何项目,只插入即可。“C”是要插入的项。console.log(correctLetters);//[“A”,“B”,“C”,“D”](新数组包含新字符)console.log(字母);//[“A”、“B”、“D”](未修改)

如果需要向数组中插入多个项,就像它的同级项一样.拼接(),您可以使用.to拼接()具有多个参数:

.to拼接(插入索引,0,“C”,“D”,“E”);

例如,上面将插入“C”,“D”、和“E”插入索引不修改数组,而是返回一个新数组。

0

现在有ToSpliced方法。

const months=[“一月”,“三月”,“四月”,“五月”];//在索引1处插入元素const months2=months.toSpliced(1,0,“Feb”);
1
  • 非place版本的“splice”:喜欢!
    – 橡胶包
    评论 5月2日9:25
2
//假设我们有一个数组让myArray=[2,4,6,8,10];//要插入项目的索引让indexToInsert=3;//我们要插入的项让itemToInsert=174;//现在我们使用splice()方法在指定索引处插入项myArray.splice(indexToInsert,0,itemToInsert);//具有新值的输出console.log(myArray);
1
  • 您的答案可以通过其他支持信息加以改进。拜托编辑添加更多详细信息,例如引文或文档,以便其他人可以确认您的答案是否正确。你可以找到更多关于如何写出好答案的信息在帮助中心.
    – 社区 机器人程序
    评论 2023年8月9日12:54
1

以下是现代(打字功能)方式:

导出常量insertItemInList=<T>(arr:T[],索引:数字,新项目:T):T[]=>[…arr.slice(0,索引),newItem,…arr.scice(索引)]
1

我这样做:

常量插入=(what,where,index)=>([…where.slice(0,index),what,…where.slice(index,where.length)]);

常量插入=(what,where,index)=>([…where.slice(0,index),what,…where.slice(index,where.length)]);常数列表=[1,2,3,4,5,6];const newList=插入('a',list,2);console.log(newList.indexOf('a')===2);

1

下面是一个支持同时插入多个值的简单函数:

函数add_items_to_array_atposition(数组、索引、新项){return[…array.slice(0,index),…new_items,…array-slice(index)];}

用法示例:

设old_array=[1,2,5];设new_array=add_items_to_array_at_position(old_array,2,[3,4]);console.log(new_array);//输出:[1,2,3,4,5]
1
  • 这与许多现有的答案类似,但包含了尚未发布的函数/排列运算符/多项目/示例/输出的简明组合。 评论 2022年3月13日8:33
1
var数组=[10,20,30,40]变量i;变量pos=2//pos=索引+1/*pos是我们要插入的位置,它是索引+1。数组中的位置2是索引1*/var值=5//要插入的值//从最后一个数组元素初始化对于(i=数组长度-1;i>=位置-1;i--){数组[i+1]=数组[i]}数组[pos-1]=值console.log(数组)
1
  • 2
    正如目前所写,你的答案不清楚。拜托编辑添加其他详细信息,帮助其他人了解这是如何解决问题的。你可以找到更多关于如何写出好答案的信息在帮助中心.
    – 社区 机器人程序
    评论 2022年7月25日11:31

不是你想要的答案吗?浏览标记的其他问题问你自己的问题.