2016-03-10 6 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/ Array/фильтр). Тогда вы узнаете, как это работает, и правильно ли это решение вашей проблемы. –

ответ

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

Чистой для цикла версии,

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

Итак, опять же, так как вы никогда не возвращаются true из вашего filter предиката, вы получаете пустой список, который вы переходите к console.log наружу.

Чтобы просто итерацию по списку, вы должны либо использовать for loop:

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

или forEach method:

library.forEach(function(obj) { 
    ... 
}); 
Смежные вопросы