2013-08-10 9 views
5

Praca nad wyzwaniem programistycznym w celu ponownego wdrożenia funkcjonalności pliku underscore.js w standardowym języku javascript. W szczególności pracuję nad implementacją funkcji _.some. (http://underscorejs.org/#some) Część, z którą walczę, polega na tym, że muszę znaleźć sposób na jej rozwiązanie wewnętrznie. (http://underscorejs.org/#every)Jak rozwiązać problem _.some za pomocą _.every?

Mam już wcześniej funkcję _.every i działa tak, jak powinna.

Oto logicznie co ja chce zrobić w kodzie szkicowanego:

_.some = function(collection, truthStatementFunction) { 
    return !(_every(collection, !truthStatementFunction)) 
} 

lub angielskim, flip oświadczenie prawdy przetestowania gdzie warunek jest fałszywy ... a jeśli test _.every następnie zwraca true ... potem wiemy, że część oryginalnego stwierdzenia prawdy jest nieprawdziwa (więc prześlij powrót _.every, aby uzyskać prawidłowy zwrot za _some). Podobnie, jeśli _.every zwraca wartość false, odwróć to, aby uzyskać poprawny zwrot wartości true dla _.some.

Oczywiście problem z tym szkicem to część !truthStatementFunction. Jak dostać się do tego Iteratora, aby zmienić wewnętrzne funkcje, aby je odwrócić? Nie wydaje się, że funkcje wewnętrzne są dostępne ...

Czy szczerzę złe drzewo w całości i czy istnieje lepszy sposób na rozwiązanie tego problemu za pomocą _.every?

+1

Masz dobry pomysł. Jednak musisz [skomponować] (https://en.wikipedia.org/wiki/Function_composition) operator '!' I funkcję; jest to coś w stylu 'function (x) {return! truthStatementFunction (x)}' zamiast tylko '! truthStatementFunction'. –

+1

Aby odpowiedzieć na twoje pytanie ... Jest to ćwiczenie do nauki, więc chodzi o to, aby uczyć się w ten czy inny sposób (chociaż wiem, że samodzielne rozwiązywanie go w 100% byłoby najskuteczniejszym sposobem nauki, utknięcia zbyt długo i marnowania czasu że mógłbym spędzać uczenie się innych równie przydatnych rzeczy nie robi mi nic dobrego). Wolałbym uzyskać tutaj podpowiedź, a nie bezpośrednią odpowiedź, ale nie byłam pewna, czy to byłoby sprzeczne z pozornie surowymi regułami przepełnienia stosu. – jjj

Odpowiedz

9

Przełęcz _every funkcja, która zwraca odwrócenie wyniku z truthStatementFunction:

_.some = function(collection, truthStatementFunction) { 
    return !(_every(collection, function(v) { 
     return !truthStatementFunction(v); 
    })); 
} 

Aby odpowiedzieć na drugą część twojego pytania:

i czy jest lepszy sposób, aby rozwiązać ten problem za pomocą _.każdy?

Jest zdecydowanie lepszy sposób na rozwiązanie tego problemu niż użycie _.every. Po prostu przejrzyj kolekcję i zwróć true, gdy tylko znajdziesz pasujący element. O wiele skuteczniejszy w przypadkach, w których _.some ma zwrócić true, ponieważ nie obchodzi cię, ile elementów w kolekcji spełnia predykat, o ile istnieje co najmniej jeden.

_.some = function(c, pred) { 
    for(var i = 0; i < c.length; i++) { 
     if (pred(c[i])) return true; 
    } 
    return false; 
} 
+0

Dzięki! Przy wszystkich widokach, na które patrzyłem, zapomniałem, że mogę jednoznacznie zdefiniować funkcję, którą przechodziłem do _.every (_.every sam używa _.reduce do spełnienia wyzwania, więc zakresy zaczynają być trochę mylące !) Przy okazji na koniec pytałem, czy istnieje lepszy sposób na rozwiązanie USING _.every, NIE NIE WYKORZYSTUJ eve _ryry ... Zgadzam się, że pętla for byłaby znacznie prostsza niż to wszystko! – jjj

+0

@ggg Powodem, dla którego sugerowałem pętlę for, nie była prostota, ale raczej wydajność. Korzystanie z podejścia '_.every' jest * dużo * wolniejsze (średnio) niż prosta iteracja. –

Powiązane problemy