2015-04-06 17 views
0

我对此代码的期望是[1, 2, 5, 6, 7, 8, 9]。结果是[7, 8, 9]。我的错误在哪里? Jsfiddle for this。谢谢。Lodash懒惰链不适合我

var ar = [1, 2, 3, 4, 5, 6], 
    arWrapper = _(ar), 
    removedTypes = [3, 4], 
    addedTypes = [7, 8, 9]; 

_.each(removedTypes, function (removedType) {  
    arWrapper = arWrapper.remove(function (type) { 
     return type === removedType; 
    }); 
}); 
_.each(addedTypes, function (addedType) { 
    arWrapper = arWrapper.push(addedType); 
}); 

console.log("%O", arWrapper.value()); 
+1

'arWrapper.remove'返回一个新的数组。不是Lodash对象。 – cgTag

+0

@MathewFoscarini未链时 – zerkms

回答

2

您的解决方案是不是“地道”,因为它依赖于自由变量在这里和那里(而且是“太势在必行”整体):

的“更好”的解决办法是:

var result = arWrapper.difference(removedTypes).union(addedTypes); 

的jsfiddle:http://jsfiddle.net/xb90agw2/1/

由于您的解决方案 - 这是行不通的,因为.remove()回报一个集合中删除元素,而不是您假设的过滤元素的集合。

+0

谢谢@zerkms。为简单起见,我的“解决方案”被缩减了:实际上,我在这里的每个'.each()'中都需要更多的代码。 '.difference()'和'.union()'不会帮助。 [Jsfiddle](http://jsfiddle.net/maximmig/xb90agw2/2/) –

+0

[到目前为止的解决方案](http://jsfiddle.net/maximmig/xb90agw2/3/)。感谢您指出'.remove()'也不会有帮助。 –

+0

@MaximMig它仍然很丑。如果你问得好,我们会帮你写地道的。目前,在你的代码中使用lodash没有任何好处:用普通的'forEach'和'if'来重写它,它会更好。 – zerkms