Javascript 函数式重写周期
我创建了一个简单的函数:它有数组作为输入和id。函数假设在给定的想法之前接受所有元素Javascript 函数式重写周期,javascript,functional-programming,Javascript,Functional Programming,我创建了一个简单的函数:它有数组作为输入和id。函数假设在给定的想法之前接受所有元素 function takeBefore(stars, id) { var taken = []; for(var i = 0, length = stars.length; i < length; i++) { if (stars[i].itemId === id) { break; }
function takeBefore(stars, id) {
var taken = [];
for(var i = 0, length = stars.length; i < length; i++) {
if (stars[i].itemId === id) {
break;
}
taken.push(stars[i]);
}
return taken;
}
函数takeBefore(星号,id){
风险值=[];
对于(变量i=0,长度=stars.length;i
下面的代码可以完成这项工作,但最近我变得有点挑剔了。想要摆脱for循环和一些功能性风格
可以使用
下划线
或ES5
函数来完成相同的工作吗?这种东西通常称为takeWhile
/dropWhile
。您可以使用布尔迭代器every()
实现它们:
函数takeWhile(数组,谓词){
var pos=-1;
var all=array.every(函数(x,n){
返回(pos=n),谓词(x);
})
返回数组.slice(0,pos+all);
}
函数dropWhile(数组、谓词){
var pos=-1;
var all=array.every(函数(x,n){
返回(pos=n),谓词(x);
})
返回数组.slice(pos+all);
}
a=[1,2,3,4,5,6,7]
b=takeWhile(a,函数(x){returnx<5})//1,2,3,4
b=dropWhile(a,函数(x){returnx<5})//5,6,7
您可以这样做:
x = [1,2,3,4,5];
x.slice(0, x.indexOf(3));
结果:
[1, 2]
那真的很好用!你能把
每一个都解释一下吗。。我以为它会返回布尔值,为什么它会被用作pos+all?@alexanderb:这实际上是一个黑客攻击。当与+
一起使用时,布尔值被转换为int(true=1,false=0),我用它将位置移动1,以防所有元素都匹配谓词。
[1, 2]