"Mapping" Little Schemer 对 coderbyte 的挑战:大写

"Mapping" Little Schemer to coderbyte challenge: Capitalize

在学习了 The Little Schemer 的大部分内容之后,我一直在尝试一些递归解决 Coderbyte 挑战的方法。

经过一些摆弄后,我加入了 cons 并认为我的 upperConsIt 可以通过数组查找,找到特定字母的所有实例并将每个实例都大写。最终,我将得到一个数组,我可以将其转换为一个字符串,其中一个字母现在大写。

当我尝试像 cdr 一样使用 shift() 时弹出错误。为什么是这样?在这种情况下,我需要做什么才能递归地使用 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 is not a constructor (evaluating 'array.shift()')

我只是不明白这是一个类型错误。数组应该是数组吧?

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

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

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

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

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