“映射”Little Schemer到coderbyte挑战:大写

时间:2015-05-19 22:37:11

标签: javascript arrays recursion scheme the-little-schemer

在研究了The Little Schemer的大部分内容之后,我一直在尝试一些针对Coderbyte挑战的递归解决方案。

经过一番摆弄后,我投入了缺点,并认为我的上层人员会查看一个数组,查找特定字母的所有实例并将每个字母大写。最终,我将有一个数组,我可以将其转换为一个字符串,其中一个字母现在大写。

当我尝试使用像cdr这样的shift()时,会弹出Thee ERROR。为什么是这样?在这种情况下,我需要以递归方式处理JavaScript吗?

'use strict';
var newArray = [];
var originalText = 'i will eat my sausage if i can';
var arrayToProcess = textIntoArray(originalText);

function cons(a, d) {
  return [a, d];
}

function textIntoArray(string) {
  return string.split('');
}

function upperConsIt(array, letter) {
  return array[0] === null ? null :
    array[0] === letter ? cons(array[0].toUpperCase(), upperConsIt(array.shift(), letter)) :
    cons(array[0], upperConsIt(array.shift(), letter));
}


upperConsIt(arrayToProcess, 'i');

console.log(arrayToProcess);

phantom.exit();

以下是错误输出:

  

TypeError:undefined不是构造函数(评估'array.shift()')

我只是看不出这是一个类型错误。数组应该是一个数组,对吗?

1 个答案:

答案 0 :(得分:0)

列表是2个元素['t',['e',['s',['t',null]]]]的嵌套数组。

拆分使['t', 'e', 's', 't']

array.shift()变异。你真的应该使用这样的东西:

function car(cons) {
  return cons[0];
}

function cdr(cons) {
  return cons[1];
}