我是jquery和函数式编程的初学者 我将jquery函数转换为函数编程范例,以下是原始的jquery函数
merge: function( first, second ) {
var len = +second.length,
j = 0,
i = first.length;
for ( ; j < len; j++ ) {
first[ i++ ] = second[ j ];
}
first.length = i;
return first;
},
我像
merge: function( first, second ) {
var len = +second.length,
j = 0,
i = first.length;
let main = (first,second)=>
{return R.concat(first, second);}
first.length = i;
return main(first,second)
},
但是Jquery测试套件没有通过。
它只是通过了测试编号5
(就绪:就绪回调中的错误不会停止所有将来的执行(gh-1823)(1))
并且没有通过测试6。
我认为我的代码有一些副作用。但我猜不到。
有没有人可以找到它?
答案 0 :(得分:0)
在其他问题上the answer显示了如何更简单地编写此函数,并且尽管我们没有足够的信息来知道您的测试套件为什么失败(下一次包括失败的测试) ,我们可以看看您的功能。重新格式化,这是
const merge = function( first, second ) {
var len = +second.length,
j = 0,
i = first.length;
let main = (first,second) => {
return R.concat(first, second);
}
first.length = i;
return main(first,second)
}
现在让我们简化一下。您的退货单为return main(first, second)
。并且main
函数完全不依赖于len
,j
或i
,并将first.length
重置为刚从{{ 1}}什么也不做。因此,编写起来就像
first.length
但是现在请注意,您的辅助函数在其闭包中除了外部函数的参数外什么都没有,并且它们被其自己的参数遮盖了。这意味着您可以完全消除它,而只需使用它的主体即可。
所以我们进入
const merge = function( first, second ) {
let main = (first,second) => {
return R.concat(first, second);
}
return main(first,second)
}
最后,格式为const merge = function( first, second ) {
return R.concat(first, second);
}
的函数除了重命名function(p1, p2, ..., pn) {return anotherFunc(p1, p2, ..., pn);}
之外没有做其他事情。
所以最后,您可以只写
anotherFunc
我不知道为什么您的函数需要做更多的工作,但这都是不必要的。我看不到有什么会导致测试套件失败,因为您确实编写了仍然可以正常工作的函数,并且没有明显的副作用,但是也许测试系统实际上跟踪了长度的变化其参数。那将是不寻常的,但肯定是可能的。
答案 1 :(得分:0)
我看不到您的代码中可能导致该错误的任何内容。 jQuery中与that test case相关的代码应该完全无关。
也就是说,这两个函数之间的区别之一是jQuery merge
将second
的元素插入到first
数组实例的末尾。 R.concat
将参数视为不可变的,返回一个包含first
和second
所有元素的新数组,而原始first
和second
数组则保持不变。 n.b.如果依赖jQuery函数中数组的就地修改,这将在行为上产生差异。
顺便提一下,您的第二个示例也可以像这样简化:
merge: function( first, second ) {
return R.concat(first, second);
}
或更简单地说:
merge: R.concat