【问题标题】:Get argument objects to work on underscore _.first function?获取参数对象以处理下划线 _.first 函数?
【发布时间】:2020-07-29 14:49:30
【问题描述】:

我必须重新创建下划线 _.first 函数,但我无法让它在参数对象上工作。以下是它必须通过的测试:

  • 应该返回一个包含数组前 n 个元素的数组
  • 如果 n 不是数字、为零或负数,则应返回包含第一个元素的数组
  • 如果 n 大于长度,则应该返回整个数组
  • 如果数组不是数组,则应该返回一个空数组
  • 应该在参数对象上工作

这就是我目前所拥有的:

_.first = function (array, n) {

  var arr = [];

  if (!Array.isArray(array)) return arr;
  if (isNaN(n) || n == null || n <= 0) return array.slice(0,1);
  else return array.slice(0, n);
};

非常感谢任何帮助!非常感谢:)

【问题讨论】:

  • “参数对象”是什么意思?它应该能够返回对象的前 n 个属性吗?

标签: javascript arrays arguments


【解决方案1】:

解决了。

_.first = function (array, n) {

  if (array == null || array == undefined || array.length < 1) return [];
  array = Array.from(array);
  if (isNaN(n) || n == null || n <= 0) return array.slice(0,1);
  else return array.slice(0, n);
};

【讨论】:

    【解决方案2】:

    我猜你在找

    _.first = function (array, n) {
      if (!Array.isArray(array))
        array = Array.from(array);
      if (typeof n != "number" || isNaN(n) || n <= 0)
        n = 1;
      return array.slice(0, n);
    };
    

    Array.from 适用于任何可迭代或具有.length 属性的对象,就像arguments 对象一样。但是,这个练习看起来像是希望您自己实现一个元素复制循环,而不是调用 slice,这样就可以轻松地处理任何类似数组的对象。

    【讨论】:

    • 这解决了问题,但是在使用它之后还有另一个测试失败“如果数组不是数组,应该返回一个空数组”:/
    • @Ed.P 请不要在发布答案后将不同的要求编辑到问题中。此外,这些测试是相互矛盾的:arguments 对象不是数组,那么它应该如何处理它们呢?请向您的导师寻求说明。
    【解决方案3】:

    如果它应该能够在参数是对象的情况下返回n 第一个条目,那么这样的东西应该可以工作:

    if (typeof array === 'object' && array !== null) {
       const obj = array;
       return Object.entries(obj).slice(0, n);
    }
    

    【讨论】: