2015-03-25 4 views
0

Так что в основном мне нужно использовать каждую функцию, которую я реализовал в функции фильтра, чтобы функция фильтра возвращала только элемент в myArray, который больше 2. i m полностью застрял.выбор функции обратного вызова javascript

var myArray = [1, 2, 3, 4, 5]; 

function each(collection, callback) { 
    for (var i = 0; i < collection.length; i++) { 
     callback(collection[i]); 
    } 
} 

function filter(collection, test) { 
    var returnAr = []; 
    for (var i = 0; i < collection.length; i++) { 
     if (test(collection[i])) { 
      returnAr.push(collection[i]) 
     } 
    } 
    //instead of using "for(var i = 0; i < collection.length; i++)" 
    // how can i use the each function i implemented above? 

    return returnAr; 
} 

filter(myArray, function(n) { 
    return n > 2; 
} 

ответ

0

each функция вызывает свой обратный вызов, передавая каждый элемент массива в качестве аргумента функции. Поэтому правильный способ назвать это будет:

each(collection, function(item) { 
    if (test(item)) { 
     // ... 
    } 
} 

Javascript не вполне обеспечивает хороший самодокументирован способ задания функции подписи [1]. Обычно это разрешается путем чтения документации API. Но если это ваш собственный код и он не поставляется с документацией API, вам нужно посмотреть, как вызывается обратный вызов. В этом случае она называется:

callback(collection[i]); 

Который говорит нам о том, что функция должна принимать один аргумент, который является один элемент из массива.

[1]: также называется прототип, нет, не в яваскрипта смысле этого слова «прототип», в том смысле, C слова «прототип»

+0

функциональный фильтр (сбор, тест) { \t var returnAr = []; \t каждая (сбор, функция (пункт) \t { \t \t, если (тест (пункт)) \t \t { \t \t \t returnAr.push (пункт) \t \t} \t}) \t возврата returnAr; } –

+0

Да, это правильно. – slebetman

+0

THANKS slebetman, ur comment исправить последнюю серьезную синтаксическую ошибку. также большой СПАСИНО к cdosborn. проклятый мой парень, программирующий пар, он мог бы сказать инкапсуляцию или f (g (h (x))), и я был бы в правильном направлении. Я не могу обвинять его, хотя его босс заставлял его делать процедуру, как он. –

0

Вы не можете. Функция «каждый» выше выполняет обратный вызов по всем элементам коллекции. Но в «фильтре» вы решаете, хотите ли вы элемент в результирующем массиве на основе результата обратного вызова. Таким образом, «фильтр» и «каждый» - это разные операции. Что бы вы ни делали в текущей функции, это правильный способ фильтрации.

0

Подпись для each принимает массив как вещь и функцию, вызываемую элементом.

function each(collection, callback) { 
    for (var i = 0; i < collection.length; i++) { 
     callback(collection[i]); 
    } 
} 

Похоже, ваш обратный вызов должен просто делать то, что это делает:

if (test(collection[i])) { 
     returnAr.push(collection[i]) 
    } 

Обратите внимание, что коллекция [я] являюсь первым аргументом функции обратного вызова.

Ваш обратный вызов будет иметь вид:

function(element) { 
    // do stuff 
} 
+0

ваш код так же, как мой лол. он не работает по сравнению с правильным ответом, который является исходным почтовым кодом там. –

+0

Я не собираюсь давать вам ответ, я пытаюсь подтолкнуть вас к нему – cdosborn

+0

lol. хороший. i m reading Eloquent Javascript более высокий порядок funtion и надеюсь, что я смогу достичь того, что у вас есть в виду LOL. –

0

Если вы действительно хотите только фильтровать массив на состоянии вы даете, это весь код, вам нужно:

myArray.filter(function(item) { return item > 2 }) 
+0

Этот ответ неуместен в контексте – cdosborn

+0

Майкл, вам нужно оставить все в покое и изменить реализацию функции фильтра только потому, что там, где проблема. да, это очень строго, так что вам нужно играть вместе с themlol. –

+0

Ну, на ваш вопрос непонятно, почему вы хотите реализовать что-то, что язык EcmaScript уже реализовал для вас. –

Смежные вопросы