【问题标题】:How to write a function that emulates _.each() from underscore.js如何编写一个从 underscore.js 模拟 _.each() 的函数
【发布时间】:2023-03-02 21:23:01
【问题描述】:

有一个练习我无法绕开。 我需要编写一个函数来模拟 underscore.js 函数 _.each() 以产生相同的结果并通过以下测试:

  • 应该遍历一个数组
  • 应该迭代一个对象
  • 应该忽略对象原型
  • 应该访问原始集合
  • 如果通过则应该绑定到上下文
  • 应该返回集合

这是给定的空函数:

_.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 循环遍历对象,忽略对象原型属性。 我其实并不想有问题的解决方案,也不想有具体的代码,只是往正确的方向推动,然后自己找到解决方案。 我对 JS 很陌生,我承认我真的想不出办法来面对这个问题。任何建议将不胜感激。 谢谢

【问题讨论】:

  • 退货收集应该很容易吧? .绑定函数?其余的似乎已经存在
  • 绑定函数我什至没有开始写它,因为它一直告诉我所有测试都失败了,所以我首先想修复函数以至少通过前三个测试:应该迭代一个数组应该迭代一个对象应该忽略对象原型
  • 我怀疑它未能通过某些测试,因为您实际上并没有使用 iteratee 并且测试正在利用该参数来检查您的结果。

标签: javascript underscore.js each


【解决方案1】:

这里有一个提示。我希望这能将您推向正确的方向。

_.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
};

【讨论】:

    【解决方案2】:

    通常,每个实现的测试首先创建一个示例函数和一个示例集合,然后在它们上调用您的函数。 示例:

    var array0 = [1,2,3];
    var array1= [];
    var iteratee = function (item) {
    array1.push(item * 2);
    }
    

    当对每个项目调用该函数时,它将执行已指定的操作。因此,在这种情况下,它将每个项目乘以 2 的结果推送到空数组中。
    上述示例的预期输出将是一个带有 [2,4,6] 的 array1。 由于调用 iteratee 时您还没有编写该部分,因此当测试运行时,什么也没有发生。

    【讨论】:

      猜你喜欢
      • 2012-02-05
      • 2014-08-09
      • 1970-01-01
      • 1970-01-01
      • 2013-01-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多