2016-08-01 37 views
-1

我寫過一個演示,通過索引從數組中刪除特定的元素。使用splice前後得到結果數組()

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>

Array.prototype.splice()說有關return value:含有缺失元件

數組。如果只刪除一個元素 ,則返回一個元素的數組。如果刪除了 沒有元素,則返回一個空數組。

它沒有提到:如果我想得到結果數組,我應該將它與關鍵字return結合起來嗎?

這應該是一個情況,因爲我得到2差的結果:

1,3

我的問題:什麼樣的,在這種情況下return array.splice(index, 1)發生的呢?

+0

是的,你需要的,如果你想有一個函數返回值使用'return'與關鍵字的值。 – Malk

+0

我不明白你在這裏誤解了什麼。您發佈的代碼片段顯示與MDN所解釋的行爲相同的行爲。如果你返回'Array.prototype.splice'的結果,你將得到一個已經被刪除的元素數組,而不是原始數組。 – Damon

+0

@Damon你看過我的問題嗎?同樣的行爲,但請提供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不管還有什麼過它的陣列。

+0

這對我的想象力更好。非常感謝! –

+0

@HappyCoding沒問題,很高興我能幫忙!你可以考慮的另一種方法是,假設你有一個函數除了返回一個數字之外什麼都不做。如果您在另一個函數中隨機調用該函數,則它不會執行任何操作,因爲不使用返回值。但是,如果您返回該函數,則外部函數也將返回該數字,從而使用返回值。 – Damon

+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

Array.prototype.splice將從m指數數組,並返回刪除值刪除n數據作爲數組:

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);

所以在您的情況吧將從數組中刪除一個元素(索引處的值)並將其返回到新數組中。

1

我修改了你的函數來顯示返回值的差異。他們將改變傳遞在數組中相同的方式。唯一改變的是返回值。這可能是你困惑的地方。請注意,在運行splice_b之前,array變量被更改爲splice_a

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(_))

+0

我已經讀了你的例子很多次了,我明白你在說什麼,但是在我的例子中'最終值'是'3'而不是'1'。我試圖找出差異 –

+0

我刪除了'alerts()',但是如果你把它們放回去,你會得到相同的結果記住'splice_b'返回的是'removed'值,它是3. – Malk

+0

ya。區別在於:'splice_a'返回一個數組,'splice_b'返回一個元素('去掉的值'),對嗎? –