2017-07-10 73 views
-4

這是來自CodeWars的一個名爲「查找中間元素」的問題。我試着用下面的代碼解決它:爲什麼concat()/ slice(0)是必要的?

var gimme = function (a) { 
    return a.indexOf(a.sort(function(a, b) { return a - b })[1]); 
}; 

但它不能工作,它需要添加concat()或slice(0)。正確答案是:

return a.indexOf(a.concat().sort(function(a, b) { return a - b })[1]); 

但是我不知道爲什麼?請幫幫我。

+0

也許你應該告訴我們原來的問題是什麼,而不僅僅是這是「在codewars」?不知道函數是如何調用的,用什麼參數,這是無法回答的。 – adeneo

+3

'sort'修改原始數組。 'concat'和'slice'構成數組的一個副本。 –

回答

1

這很可能是因爲他們希望你以一種不會修改參數的乾淨方式來做到這一點(這通常是一個不應該避免的禁忌)。

通過使用concat()和/或slice(0),您可以創建一個新的數組實例,因此您不需要修改原來輸入的數組。

const a = [3,1,2]; 
 
const b = [3,1,2]; 
 

 
const dangerous = (arr) => arr.sort(); 
 
const safe = (arr) => arr.slice(0).sort(); 
 

 
const d = dangerous(a); 
 
const s = safe(b); 
 

 
console.log(a, d, a === d); 
 
console.log(b, s, b === s);

通知的dangerous()功能實際上是如何改變了我們的a,這可能會產生意想不到的,不易發現的後果。 b沒有得到safe()的更改,而是創建了一個新數組。

相關問題