Solution to 99 lisp problems: P08, with functional javascript

If a list contains repeated elements they should be replaced with a single copy of the element. The order of the elements should not be changed.

* (compress '(a a a a b c c a a d e e e e))
  (A B C A D E)

Anyone want to review?

function cond( check, _then, _continuation ) {
  if(check) return _then( _continuation )
  else return _continuation()

function compress( list ) {
  return (function check( index, item, nextItem, compressed ) {
    return cond( item !== nextItem, function _then( continuation ) {
        compressed = compressed.concat([ item ])
        return continuation()
    function _continueation() {
      return cond(!nextItem, function _then() {
          return compressed
      function _continuation() {
          return check( index + 1, list[index + 1], list[index + 2], compressed )  
  })( 0, list[0], list[1], [] )


  • \$\begingroup\$ Wouldn't a loop or recursive calling be a better idea? \$\endgroup\$ – Inkbug Jul 23 '12 at 5:19
  • \$\begingroup\$ The cond function can probably be replaced with a ternary operator and switching the order a little. \$\endgroup\$ – Inkbug Jul 23 '12 at 5:20

I don't think you need so much complexity in javascript. It's not a fully functional language, don't try to make it so.

var arr = [
    'a', 'a', 'a', 'b', 'b', 'c', 'd', 'd', 'a', 'e', 'e', 'e'

arr = arr.filter( function( el, i ) {
    // return if the current isn't the same as the next
    return el !== arr[ i + 1 ];

console.log( arr ); // ["a", "b", "c", "d", "a", "e"]

This is 2 lines.

  • \$\begingroup\$ The function passed to filter can be generalized by adding a third parameter arr. \$\endgroup\$ – delete me Jul 26 '12 at 1:10

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

Not the answer you're looking for? Browse other questions tagged or ask your own question.