Как сделать X с помощью Y?
Обычно ко всем этим вопросам я подхожу одинаково: языки программирования не должны быть волшебными палочками. Если ваш язык не имеет встроенной функции или поведения, вы сможете написать его самостоятельно. Оттуда, если вы позже узнаете, что ваш язык действительно предлагает встроенную функцию для такого поведения (или она добавлена), вы можете реорганизовать свой код, если хотите. Но ни в коем случае не сидите без дела в ожидании взмаха волшебной палочки и волшебного действия вашего кода.
Вы можете использовать Array.prototype.reduce
, если хотите, но, учитывая то, как он работает, он всегда будет перебирать все содержимое массива, даже если совпадение найдено в первом элементе. Это означает, что вы не должны использовать Array.prototype.reduce
для своей функции.
Однако вы можете использовать решение сокращения, если вы пишете reduce
, который поддерживает ранний выход. Ниже показан reducek
, который передает продолжение обратному вызову. Применение продолжения продолжит сокращение, но возврат значения приведет к досрочному выходу. Похоже на то, что доктор прописал...
Этот ответ должен сопровождать ответ LUH3417, чтобы показать вам, что, прежде чем вы узнаете о Array.prototype.some
, вам не следует сидеть и ждать, пока ECMAScript реализует нужное вам поведение. Этот ответ демонстрирует, что вы можете использовать процедуру сокращения и по-прежнему иметь поведение раннего выхода.
const reducek = f=> y=> ([x,...xs])=>
x === undefined ? y : f (y) (x) (y=> reducek (f) (y) (xs))
const contains = x=>
reducek (b=> y=> k=> y === x ? true : k(b)) (false)
console.log(contains (4) ([1,2,3,4,5])) // true
console.log(contains (4) ([1,2,3,5])) // false
console.log(contains (4) ([])) // false
Глядя на reducek
здесь и пример функции contains
, должно быть несколько очевидно, что contains
можно обобщить, что и есть Array.prototype.some
.
Опять же, программирование — это не волшебство, поэтому я покажу вам, как вы могли бы это сделать, если бы Array.prototype.some
еще не существовало.
const reducek = f=> y=> ([x,...xs])=>
x === undefined ? y : f (y) (x) (y=> reducek (f) (y) (xs))
const some = f=>
reducek (b=> x=> k=> f(x) ? true : k(b)) (false)
const contains = x=> some (y=> y === x)
console.log(contains (4) ([1,2,3,4,5])) // true
console.log(contains (4) ([1,2,3,5])) // false
console.log(contains (4) ([])) // false
person
Mulan
schedule
15.07.2016
Array.prototype.reduce
, но вы можете написать свою собственную функциюreduce
, которая понимает значенияreduced
(которые завершают итерацию). - person MinusFour   schedule 20.10.2015Array.indexOf
? - person adeneo   schedule 20.10.2015indexOf()
самый простой и уже существует - person charlietfl   schedule 20.10.2015Array.indexOf
, но мне нужно собрать содержимое с помощью сокращения. Этот вопрос был на собеседовании, так что вот почему. - person hackermann   schedule 20.10.2015some
было бы более эффективным, потому что он выходит из цикла, как только найденный элемент найден. - person Jeremy Larter   schedule 21.10.2015