2016-02-11 76 views
0

我需要編寫一個代碼,該代碼獲取一個整數數組並返回一個數組,其中元素增加,如果是偶數,則減少,如果是奇數。 我嘗試使用過濾器和地圖JavaScript函數。這是代碼:過濾器和地圖在javascript中的奇怪行爲

var test=[2,5,8,13]; 
var my_function = (some_array) => some_array.filter((num,index,array) => num % 2 == 0 ? array[index]=num+1 : array[index]=num-1); 
console.log(my_function(test)); 
console.log(test); 

這個代碼打印[2,5,8,13] [3,4,9,12],而使用地圖 你有

var test=[2,5,8,13]; 

var my_function = (some_array) => some_array.map((num,index,array) => num % 2 == 0 ? array[index]=num+1 : array[index]=num-1); 
console.log(my_function(test)); 
console.log(test); 

這個代碼[3,4,9,12] [3,4,9,12]

正如您所看到的使用過濾器一樣,對象在映射時被克隆,對象被更改。 關於MDN的文檔說:

map()方法創建一個新數組,其結果是調用此數組中每個元素的提供函數的結果。

我是以錯誤的方式使用地圖和過濾器還是文檔錯誤? 我在Chrome和Firefox上測試了這種行爲。

其實我使用的是錯誤的地圖功能。這裏是固定的地圖代碼

var my_function = (some_array) => some_array.map((num) => num % 2 == 0 ? num+1 : num-1); 

回答

0

做你想做什麼,你可以使用地圖這樣的:

var result = test.map(function(m){ return m % 2 === 0 ? m+1 : m-1 }); 
console.log(result); 

過濾器也是可以的,但就個人而言,我更喜歡的地圖。請記住,該地圖返回一個新的數組結果。小心不要改變你原來的數組。

+0

簡單明瞭!謝謝 :) – Antonio

0

你用錯了。 Filter獲取返回布爾值的函數,並僅保留該函數返回true的數組中的元素。這裏發生的事情是,當你使用arr [i] =時,你既修改了原始數組,又返回了值「something」,其值爲true。這就是爲什麼原始數組被修改並且函數沒有修改就返回原始數組的原因。 map函數返回從數組到函數結果的映射。既然你修改了數組並且返回了你修改它的相同值,你得到了兩個不同的數組,它們具有相同的值。

+0

其實這種行爲恰恰相反。第一個日誌是我想要的,而第二個是原始數組 – Antonio

2

你們都是通過作爲lambda(「array」)中的第三個參數傳遞的引用對數組進行變異,並通過lambda返回值返回一個新數組。映射和過濾器通常用於數組沒有變異的功能樣式,但是會創建一個新數組並從函數返回。

你想在這裏使用地圖而不是過濾器。儘管當前的過濾器實現可以實現您想要的功能,但使用過濾器的慣用方法是輸入一個數組,並返回一個新的數組,該數組包含第一個數組中的一部分元素,即滿足由傳遞表示的謂詞的元素功能。

使用map的習慣用法是輸入一個數組,並返回一個與第一個數組長度相同的新數組,但它的某些功能應用於每個原始元素。這是你想要的,你的函數應該簡單地測試奇數/偶數,然後分別返回n-1或n + 1。

+0

過濾結果是好的,而地圖結果有點爭議據我瞭解 – Antonio