在使用splice()之前和之后获取结果数组

时间:2016-08-01 20:59:38

标签: javascript arrays

我编写了一个演示程序,通过索引从数组中删除特定元素。



var splice_a = function (array, index) {
  array.splice(index, 1);
  return array
};

var splice_b = function (array, index) {
  return array.splice(index, 1)
};

var test = function () {
  var array = [1, 2, 3];
  
  alert(splice_a(array, 1));
  alert(splice_b(array, 1));
};

<button onclick="test()">Click me</button>
&#13;
&#13;
&#13;

Array.prototype.splice()return value

  

包含已删除元素的数组。如果只有一个元素   删除后,返回一个元素的数组。如果没有元素   删除后,返回一个空数组。

它没有提到:如果我想获得结果数组,我应该将它与关键字return结合使用吗?

应该是一个案例,因为我得到了2个不同的结果:

  

1,3

     

3

我的问题:在这种情况下return array.splice(index, 1)会发生什么?

4 个答案:

答案 0 :(得分:1)

生成的数组是您自己的数组。不需要退回。 所以它就是:

var splice_a = function (array, index) {
  array.splice(index, 1);
  return array
};
var array = [1, 2, 3, 4];

splice_a(array, 1);
alert(array) //will show 1,3,4;

splice_a(array, 1);
alert(array) //will show 1,4;

答案 1 :(得分:1)

Array.prototype.splice将从n数组索引中删除m数据,并将删除的值作为数组返回:

var m = 2,
  n = 3;
var arr = [1, 2, 3, 4, 5, 6, 7, 8, 9];
var removedValues = arr.splice(m, n);

console.log(arr, removedValues);

因此,在您的情况下,它将从数组中删除一个元素(索引处的值)并将其返回到新数组中。

答案 2 :(得分:1)

以下是正在发生的事情的抽象示例:

// a function that removes the last element from an array, and returns 1
Array.prototype.foo = function() {
  this.pop()
  return 1
}

// a function that removes the last element from an array, and returns the array
Array.prototype.bar = function() {
  this.pop()
  return this
}

如果你要调用arr.foo()arr.bar()arr会发生同样的事情,但是你调用的函数的返回值是不同的。并非每个Array.prototype方法都返回数组。例如,splice不会返回原始数组。这类似于你想要做的事情:

function foo_a(arr) {
  // call foo, removes element from arr.
  arr.foo() // We do not return here so the fact that foo returns 1 is not used.
  return arr
}

function foo_b(arr) {
  // call foo, removes element from arr.
  return arr.foo()  // We return the return value of foo here, which is 1
}

var arr = [1, 2, 3, 4];

foo_a(arr) // [1, 2, 3]
foo_b(arr) // 1

<强> TL;博士 return arr.foo()基本上是说“返回foo的返回值”,它始终为1,无论它对数组做了什么。

答案 3 :(得分:1)

我修改了你的函数以显示返回值的差异。它们将以相同的方式改变传入的数组。唯一改变的是返回值。这可能是你感到困惑的地方。请注意,array变量在splice_a运行之前已由splice_b更改。

var splice_a = function (array, index) {
  var removed = array.splice(index, 1);
  console.log(`  Removed = ${removed}`);
  console.log(`  Array = ${array}`);
  
  return array;
};

var splice_b = function (array, index) {
  var removed =  array.splice(index, 1)
  console.log(`  Removed = ${removed}`);
  console.log(`  Array = ${array}`);
  
  return removed;
};

var array = [1, 2, 3];

console.log(`Array before splice_a: ${array}`);
splice_a(array, 1);

console.log(`Array before splice_b: ${array}`);
splice_b(array, 1);

console.log(`Final value of array: ${array}`);

至于为什么你想要返回值,如果它正在改变。这主要是为了方便链接命令。考虑第一个功能:

var splice_a1 = function (array, index) {
  var removed = array.splice(index, 1);
  return array;
};
var splice_a2 = function (array, index) {
  var removed = array.splice(index, 1);
};


var array = [1, 2, 3];
// This will run, because splice_a1 returns an array
splice_a1(array, 1).forEach( _ => console.log(_) )

// This will throw an error, because <undefined> does not have a forEach()
splice_a2(array, 1).forEach( _ => console.log(_) )