JavaScript阵列拼接与切片


190

splice和之间有什么区别slice

$scope.participantForms.splice(index, 1);
$scope.participantForms.slice(index, 1);

2
Splice和Slice是内置的Javascript命令-尤其不是AngularJS命令。Slice从“开始”直到“结束”说明符之前返回数组元素。拼接会更改实际数组,并从“开始”开始,并保留指定的元素数。Google对此有很多信息,只需搜索即可。
mrunion

Answers:


259

splice()更改原始数组,slice()但不更改,但它们两个都返回数组对象。

请参阅以下示例:

var array=[1,2,3,4,5];
console.log(array.splice(2));

这将返回[3,4,5]。的原始阵列受到影响,导致array[1,2]

var array=[1,2,3,4,5]
console.log(array.slice(2));

这将返回[3,4,5]。的原始数组不受影响,由此导致array存在[1,2,3,4,5]

下面是简单的小提琴,它证实了这一点:

//splice
var array=[1,2,3,4,5];
console.log(array.splice(2));

//slice
var array2=[1,2,3,4,5]
console.log(array2.slice(2));


console.log("----after-----");
console.log(array);
console.log(array2);


20
同样重要的是要观察slice()数组方法可通过不传递任何参数来复制数组arr1 = arr0.slice()
Mg Gm

3
您可以认为它就像是splice政府向您征税。而slice更多的是复制粘贴的家伙。
radbyx

.splice()这是非常不直观的,我花了长时间试图弄清楚为什么在undefined找到该线程之前返回对原始数组的引用。
Nixinova

61

Splice和Slice都是Javascript Array函数。

拼接与切片

  1. splice()方法返回数组中已删除的项目,slice()方法返回数组中选定的元素作为新的数组对象。

  2. splice()方法更改原始数组,而slice()方法不更改原始数组。

  3. splice()方法可以接受n个参数,而slice()方法可以接受2个参数。

拼接示例

参数1:索引,必填。一个整数,指定要在什么位置添加/删除项目,请使用负值指定从数组末尾开始的位置。

参数2:可选。要删除的项目数。如果设置为0(零),则不会删除任何项目。如果未通过,则将从提供的索引中删除所有项目。

参数3…n:可选。要添加到数组中的新项目。

var array=[1,2,3,4,5];
console.log(array.splice(2));
// shows [3, 4, 5], returned removed item(s) as a new array object.
 
console.log(array);
// shows [1, 2], original array altered.
 
var array2=[6,7,8,9,0];
console.log(array2.splice(2,1));
// shows [8]
 
console.log(array2.splice(2,0));
//shows [] , as no item(s) removed.
 
console.log(array2);
// shows [6,7,9,0]

切片示例

参数1:必填。一个整数,指定从何处开始选择(第一个元素的索引为0)。使用负数从数组末尾选择。

参数2:可选。一个整数,指定在何处结束选择,但不包括在内。如果省略,则将选择从数组的开始位置到数组结尾的所有元素。使用负数从数组末尾选择。

var array=[1,2,3,4,5]
console.log(array.slice(2));
// shows [3, 4, 5], returned selected element(s).
 
console.log(array.slice(-2));
// shows [4, 5], returned selected element(s).
console.log(array);
// shows [1, 2, 3, 4, 5], original array remains intact.
 
var array2=[6,7,8,9,0];
console.log(array2.slice(2,4));
// shows [8, 9]
 
console.log(array2.slice(-2,4));
// shows [9]
 
console.log(array2.slice(-3,-1));
// shows [8, 9]
 
console.log(array2);
// shows [6, 7, 8, 9, 0]


3
尽管这两个函数执行的任务完全不同,但与splice(x,y)slice(x,y)的函数不同的是 ,第二个参数y不是从x的位置算起,而是从数组的第一个元素算起。
拉梅什·派瑞克

我要注意的另一件事是:array.slice(index, count)如果使用array.slice((index, count)),而不是,您将在“切片”之后得到剩余的零件。试试吧!
拉梅什·派瑞克

23

所述切片()方法返回的阵列的一部分的副本到一个新的数组对象。

$scope.participantForms.slice(index, 1);

这并改变participantForms阵列,但返回包含在找到的单个元素的新阵列index的原始数组中的位置。

拼接()方法改变阵列的通过去除现有元件和/或添加新元素的内容。

$scope.participantForms.splice(index, 1);

这将从participantFormsindex位置的数组中删除一个元素。

这些是Javascript原生函数,AngularJS与它们无关。


谁能提供有用的示例,每个示例都比较理想?您喜欢使用拼接或切片的情况吗?
petrosmm '18年

1
这个答案部分不正确。因为splice第二个arg是返回数组中元素的计数,但是对于slice第二个arg是要返回+ 1的最后一个元素的索引。 slice(index,1)不一定返回一个从开始的元素数组index[1,2,3,4,5].slice(0,1)返回,[1][1,2,3,4,5].slice(3,1)返回,[]因为这样1解释,但这是在返回空数组之前。final index +1final index = 0start index = 3
BaltoStar

为什么这不是最佳答案?
JJ Labajo

23

这是一个简单的技巧,可以记住slicevs与splice

var a=['j','u','r','g','e','n'];

// array.slice(startIndex, endIndex)
a.slice(2,3);
// => ["r"]

//array.splice(startIndex, deleteCount)
a.splice(2,3);
// => ["r","g","e"]

Trick to remember:

认为是"spl" (first 3 letters of splice)“指定长度”的缩写,第二个参数应该是长度而不是索引


1
这不仅仅是您指定参数的方式。其中一个(拼接)修改基本阵列,而另一个则不修改。
仲裁人

也可以将拼接视为拆分(生成2个数组)+切片

14

接头- MDN参考 - ECMA-262规范

句法
array.splice(start[, deleteCount[, item1[, item2[, ...]]]])

参量

  • start:必填。初始索引。
    如果start为负,"Math.max((array.length + start), 0)"则从末开始有效地按照规格(以下示例提供)进行处理array
  • deleteCount: 可选的。要删除的元素数量(start如果未提供,则全部删除)。
  • item1, item2, ...: 可选的。要从start索引添加到数组的元素。

返回:具有删除的元素的数组(如果未删除则为空数组)

更改原始数组:是

例子:

const array = [1,2,3,4,5];

// Remove first element
console.log('Elements deleted:', array.splice(0, 1), 'mutated array:', array);
// Elements deleted: [ 1 ] mutated array: [ 2, 3, 4, 5 ]

// array = [ 2, 3, 4, 5]
// Remove last element (start -> array.length+start = 3)
console.log('Elements deleted:', array.splice(-1, 1), 'mutated array:', array);
// Elements deleted: [ 5 ] mutated array: [ 2, 3, 4 ]

MDN Splice示例中的更多示例


切片- MDN参考 - ECMA-262规范

语法
array.slice([begin[, end]])
参数

  • begin: 可选的。初始索引(默认为0)。
    如果begin为负,"Math.max((array.length + begin), 0)"则从末开始有效地按照规格(以下示例提供)进行处理array
  • end: 可选的。最后提取的索引,但不包括(默认array.length)。如果end为负,"Math.max((array.length + begin),0)"则从末开始有效地按照规格(以下示例提供)进行处理array

返回:包含提取的元素的数组。

原始突变:否

例子:

const array = [1,2,3,4,5];

// Extract first element
console.log('Elements extracted:', array.slice(0, 1), 'array:', array);
// Elements extracted: [ 1 ] array: [ 1, 2, 3, 4, 5 ]

// Extract last element (start -> array.length+start = 4)
console.log('Elements extracted:', array.slice(-1), 'array:', array);
// Elements extracted: [ 5 ] array: [ 1, 2, 3, 4, 5 ]

MDN Slice示例中的更多示例

性能比较

不要将此视为绝对事实,因为根据每种情况,一个可能比另一个更出色。
性能测试


12

Splice和Slice是内置的Javascript命令-尤其不是AngularJS命令。Slice从“开始”返回数组元素,直到“结束”说明符之前。拼接会更改实际的数组,并从“开始”开始,并保留指定的元素数。Google对此有很多信息,只需搜索即可。


2
Splice 删除指定的数字,然后插入任何后续参数。
Josiah Keller

splice从给定的起始索引中删除给定数量的元素,例如splice(4,1); 从索引4开始删除一个元素,而splice(4,3); 删除从索引4的元素开始的三个元素。然后在删除它们之后,返回已删除的值。
briancollins081

7

splice()方法以数组形式返回已删除的项目。该slice()方法以新的数组对象的形式返回数组中选定的元素。

splice()方法改变原始阵列和slice()方法不改变原来的阵列。

  • Splice() 方法可以接受n个参数:

    参数1:索引,必填。

    参数2:可选。要删除的项目数。如果设置为0(零),则不会删除任何项目。如果未通过,则将从提供的索引中删除所有项目。

    参数3..n:可选。要添加到数组中的新项目。

  • slice() 方法可以使用2个参数:

    参数1:必填。一个整数,指定从何处开始选择(第一个元素的索引为0)。使用负数从数组末尾选择。

    参数2:可选。一个整数,指定结束选择的位置。如果省略,则将选择从数组的开始位置到数组结尾的所有元素。使用负数从数组末尾选择。


4

按索引拼接和删除数组项

指数= 2

//splice & will modify the origin array
const arr1 = [1,2,3,4,5];
//slice & won't modify the origin array
const arr2 = [1,2,3,4,5]

console.log("----before-----");
console.log(arr1.splice(2, 1));
console.log(arr2.slice(2, 1));

console.log("----after-----");
console.log(arr1);
console.log(arr2);

let log = console.log;

//splice & will modify the origin array
const arr1 = [1,2,3,4,5];

//slice & won't modify the origin array
const arr2 = [1,2,3,4,5]

log("----before-----");
log(arr1.splice(2, 1));
log(arr2.slice(2, 1));

log("----after-----");
log(arr1);
log(arr2);

在此处输入图片说明



3

slice不会更改原始数组,而是返回新数组,但是拼接会更改原始数组。

example: var arr = [1,2,3,4,5,6,7,8];
         arr.slice(1,3); // output [2,3] and original array remain same.
         arr.splice(1,3); // output [2,3,4] and original array changed to [1,5,6,7,8].

拼接方法的第二个参数不同于切片方法。拼接中的第二个参数表示要删除的元素数,而在切片中,它表示结束索引。

arr.splice(-3,-1); // output [] second argument value should be greater then 
0.
arr.splice(-3,-1); // output [6,7] index in minus represent start from last.

-1表示最后一个元素,因此它从-3到-1开始。以上是拼接和切片方法之间的主要区别。


2

//splice
var array=[1,2,3,4,5];
console.log(array.splice(2));

//slice
var array2=[1,2,3,4,5]
console.log(array2.slice(2));


console.log("----after-----");
console.log(array);
console.log(array2);


请提供关于正在发生的事情的详细信息
MKant

2

Slice()和Splice()javascript内置函数之间的区别是,Slice返回已删除的项目,但没有更改原始数组;喜欢,

        // (original Array)
        let array=[1,2,3,4,5] 
        let index= array.indexOf(4)
         // index=3
        let result=array.slice(index)
        // result=4  
        // after slicing=>  array =[1,2,3,4,5]  (same as original array)

但是在splice()的情况下,它会影响原始数组;喜欢,

         // (original Array)
        let array=[1,2,3,4,5] 
        let index= array.indexOf(4)
         // index=3
        let result=array.splice(index)
        // result=4  
        // after splicing array =[1,2,3,5]  (splicing affects original array)

0

JavaScript Array splice()方法的示例

通过tutsmake的Example1-从索引1中删除2个元素

  var arr = [ "one", "two", "three", "four", "five", "six", "seven", "eight", "nine", "ten" ]; 

 arr.splice(1,2);

 console.log( arr ); 

Example-2通过tutsmake –从索引0 JavaScript添加新元素

  var arr = [ "one", "two", "three", "four", "five", "six", "seven", "eight", "nine", "ten" ]; 

 arr.splice(0,0,"zero");

 console.log( arr );  

tutsmake的Example-3 –在数组JavaScript中添加和删除元素

var months = ['Jan', 'March', 'April', 'June'];

months.splice(1, 0, 'Feb'); // add at index 1

console.log(months); 

months.splice(4, 1, 'May'); // replaces 1 element at index 4

console.log(months);

https://www.tutsmake.com/javascript-array-splice-method-by-example/

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.