2016-03-10 155 views
1

我想記錄當前的閱讀狀態,而不是隻得到日誌我調用displayInformation()時也得到一個空數組。如何獲得我想要的結果而不需要額外的空數組?爲什麼它返回一個空數組?JavaScript過濾器方法返回過濾陣列和空數組

function displayInformation() { 
    function statusRead(obj){ 
    if (obj.readingStatus === false) { 
     console.log('You still need to read ' + obj.title + ' by ' + obj.author + '.'); 
    } else { 
     console.log('Already read ' + obj.title + ' by' + obj.author + '.'); 
    } 
    } 

    var statusFilter = library.filter(statusRead); 
    console.log(statusFilter); 
} 

var library = [ 
    { 
     title: 'Bill Gates', 
     author: 'The Road Ahead', 
     readingStatus: true 
    }, 
    { 
     title: 'Steve Jobs', 
     author: 'Walter Isaacson', 
     readingStatus: true 
    }, 
    { 
     title: 'Mockingjay: The Final Book of The Hunger Games', 
     author: 'Suzanne Collins', 
     readingStatus: false 
    } 
]; 

displayInformation(); 

當你調用displayInformation()這是什麼登錄到控制檯

"Already read Bill Gates byThe Road Ahead." 
"Already read Steve Jobs byWalter Isaacson." 
"You still need to read Mockingjay: The Final Book of The Hunger Games by Suzanne Collins." 
[] 
+0

你'statusRead()'是'返回undefined',這是爲什麼'Array.filter()'正在刪除這些元素。相反,你應該使用'library.forEach(statusRead)' – Nayuki

+2

在你使用一個不熟悉的方法之前,[閱讀它的文檔](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/陣列/過濾器)。然後你會知道它是如何工作的,以及是否正確的方法來解決你的問題。 –

回答

2

我怎樣才能得到我想要的結果,而不需要額外的空數組?

您必須使用.forEach()或正常的for loop來做你想做的事情。 .filter()用例與你的完全不同。

爲什麼它返回一個空數組?

由於.filter()方法將返回一個過濾陣列,它返回在你的情況下,空數組作爲callBack函數返回undefined所有的時間。


你的代碼應該是這樣的,

function displayInformation(library) { 
library.forEach(function(obj){ 
    if (obj.readingStatus === false) { 
     console.log('You still need to read ' + obj.title + ' by ' + obj.author + '.'); 
    } else { 
     console.log('Already read ' + obj.title + ' by' + obj.author + '.'); 
    } 
}); 
} 

displayInformation(library); 

純for循環版本,

function displayInformation(library) { 
    var i = 0, len = library.length, obj; 
    for (; i < len; i++) { 
    obj = library[i]; 
    if (obj.readingStatus === false) { 
     console.log('You still need to read ' + obj.title + ' by ' + obj.author + '.'); 
    } else { 
     console.log('Already read ' + obj.title + ' by' + obj.author + '.'); 
    } 
    } 
} 

displayInformation(library); 
+0

你也可以給出使用for循環的例子嗎? –

+0

@SOSANA增加了一個純循環版本。所以你真的不知道如何通過使用for循環來做到這一點? –

+0

因爲你的答案可以用兩者來完成,不妨一起展示:) –

0

那是因爲你打印出statusFilter這是使用statusRead進行篩選的結果。由於statusRead從不會返回true,結果將爲空。 filter的工作方式是從舊數組創建一個新數組,其中包含每個返回真值的值。例如,以下是如何從數字列表中獲取所有偶數的方法。

var evens = numbers.filter(function(x) { 
    return x % 2 === 0; 
}); 

所以,再一次,因爲你永遠不會從你的filter謂詞返回true,你得到你繼續console.log了一個空列表。

要只是遍歷List,您應該使用for loop

for (var i = 0; i < library.length; i++) { 
    var obj = library[i]; 
    ... 
} 

還是forEach method

library.forEach(function(obj) { 
    ... 
});