如何编写从 underscore.js 模拟 _.each() 的函数
How to write a function that emulates _.each() from underscore.js
有这个练习我无法理解。
我需要编写一个函数来模拟 underscore.js 函数 _.each() 以产生相同结果并通过以下测试的方式:
- 应该遍历数组
- 应该遍历 object
- 应该忽略 object 原型
- 应访问原始 collection
- 如果一个通过,应该绑定到上下文
- 应该return collection
这是给定的空函数:
_.each= function (collection, iteratee, context) {}
这是我到目前为止所写的,没有通过任何测试:
_.each = function (collection, iteratee, context) {
if (Array.isArray(collection)) {
for (let key of collection) {
console.log(key, collection.keys());
}
} else {
for (let prop in collection) {
if (collection.hasOwnProperty(prop)) {
console.log(`${prop}: ${collection[prop]}`);
}
}
}
return collection
};
我在这里要做的是用 for of 循环遍历数组,并用 for in 循环遍历 object,忽略 object 原型属性。
我其实不想有问题的解决方案,也没有具体的代码,只是往正确的方向推,然后自己找到解决方案。
我对 JS 很陌生,我承认我真的想不出一种方法来面对这个问题。任何建议将不胜感激。
谢谢
通常,对 Each 实现的测试首先创建一个示例函数和一个示例集合,然后在它们上调用您的函数。
示例:
var array0 = [1,2,3];
var array1= [];
var iteratee = function (item) {
array1.push(item * 2);
}
当对每个项目调用该函数时,它将执行已指定的操作。因此,在这种情况下,它将每个项目乘以 2 的结果推入空数组。
上述示例的预期输出将是一个包含 [2,4,6] 的数组 1。
由于您没有编写调用 iteratee 时的部分,因此当测试运行时,没有任何反应。
这是一个提示。我希望这会把你推向正确的方向。
_.each = function (collection, iteratee, context) {
// you're going to want something that checks length of arguments and binds context to iteratee here
if (Array.isArray(collection)) {
for (let key of collection) { /* you're gonna need the index later so consider using
for (let i = 0; i < collection.length; i++) {...} */
console.log(key, collection.keys()); // replace this line with calling iteratee with item, i, and collection
}
} else {
for (let prop in collection) {
if (collection.hasOwnProperty(prop)) {
console.log(`${prop}: ${collection[prop]}`); // replace this line with calling iteratee with collection[prop], prop, and collection
}
}
}
return collection
};
有这个练习我无法理解。 我需要编写一个函数来模拟 underscore.js 函数 _.each() 以产生相同结果并通过以下测试的方式:
- 应该遍历数组
- 应该遍历 object
- 应该忽略 object 原型
- 应访问原始 collection
- 如果一个通过,应该绑定到上下文
- 应该return collection
这是给定的空函数:
_.each= function (collection, iteratee, context) {}
这是我到目前为止所写的,没有通过任何测试:
_.each = function (collection, iteratee, context) {
if (Array.isArray(collection)) {
for (let key of collection) {
console.log(key, collection.keys());
}
} else {
for (let prop in collection) {
if (collection.hasOwnProperty(prop)) {
console.log(`${prop}: ${collection[prop]}`);
}
}
}
return collection
};
我在这里要做的是用 for of 循环遍历数组,并用 for in 循环遍历 object,忽略 object 原型属性。 我其实不想有问题的解决方案,也没有具体的代码,只是往正确的方向推,然后自己找到解决方案。 我对 JS 很陌生,我承认我真的想不出一种方法来面对这个问题。任何建议将不胜感激。 谢谢
通常,对 Each 实现的测试首先创建一个示例函数和一个示例集合,然后在它们上调用您的函数。 示例:
var array0 = [1,2,3];
var array1= [];
var iteratee = function (item) {
array1.push(item * 2);
}
当对每个项目调用该函数时,它将执行已指定的操作。因此,在这种情况下,它将每个项目乘以 2 的结果推入空数组。
上述示例的预期输出将是一个包含 [2,4,6] 的数组 1。
由于您没有编写调用 iteratee 时的部分,因此当测试运行时,没有任何反应。
这是一个提示。我希望这会把你推向正确的方向。
_.each = function (collection, iteratee, context) {
// you're going to want something that checks length of arguments and binds context to iteratee here
if (Array.isArray(collection)) {
for (let key of collection) { /* you're gonna need the index later so consider using
for (let i = 0; i < collection.length; i++) {...} */
console.log(key, collection.keys()); // replace this line with calling iteratee with item, i, and collection
}
} else {
for (let prop in collection) {
if (collection.hasOwnProperty(prop)) {
console.log(`${prop}: ${collection[prop]}`); // replace this line with calling iteratee with collection[prop], prop, and collection
}
}
}
return collection
};