【发布时间】:2021-05-28 23:25:24
【问题描述】:
下面的代码是 _.reduce() 方法的重新实现。这不是我的,但我正在使用它来掌握 _.reduce 的工作原理。它目前在两项测试中失败:
- 应该能够将集合减少到单个值 - AssertionError: expected 'aabcdabcdabcdabcd' to equal 'abcd'
- 应该支持初始状态 AssertionError:预期 'initabcdabcdabcdabcd' 等于 'initabcd'
_.reduce = function (list, iteratee, memo, context) {
if (context) iteratee = iteratee.bind(context);
_.each(list, (elem, index) => {
if (memo === undefined) {
memo = elem;
memo =iteratee(memo, elem, index, list);
} else memo = iteratee(memo, elem, index, list);
});
return memo;
};
我不明白为什么会这样。在我看来,这似乎应该按预期运行。谁能提供更多信息?
更新 由于@georg 发现了我的 _.each() 函数的问题,我能够解决第二个错误。第一个错误仍然存在,但略有不同:
- 应该能够将集合减少到单个值 AssertionError: 预期 'aabcd' 等于 'abcd'
这是与错误消息相关的测试代码
var mocks = {
arr: ['a','b','c','d'], // >= 4 elements, all should be truthy
obj: {a:1,b:2,c:3,d:4}, // >= 4 values, all should be truthy
halfTruthyArr: [null,'b',null,'d'], // >= 4 elements, half should be falsy
halfTruthyObj: {a:1,b:null,c:3,d:null}, // >= 4 values, half should be falsy
string: 'This is a string.',
reverseString: function (string) {
if (typeof string === 'string') return string.split('').reverse().join('');
}
};
describe('reduce', function () {
afterEach(function () {
called = false;
});
it('should be able to reduce a collection to a single value', function () {
_.reduce(mocks.arr, function (accumulator, el, i, arr) {
arr[i].should.equal(el);
return accumulator.toString() + el.toString();
}).should.equal(mocks.stringifiedArrElms);
});
【问题讨论】:
-
期望
'abcd'或'initabcd'运行的代码是什么? -
如果你以可运行的形式提供它会更容易回答/调试。
-
@ThomasDeniffel 我是一个真正的新手,所以我不确定你所说的“可运行形式”是什么意思。我试图包含测试文件,但它们太长无法评论。你能澄清一下你的意思吗?
标签: javascript underscore.js reduce memo