javascript - 使用映射、任意参数在 Javascript 中重建 _zip

标签 javascript functional-programming underscore.js

我正在努力学好 JavaScript,并正在练习重建一些下划线函数。我正在尝试使用存在任意数量参数的 map 重建 zip。这是我凭着勇气想出的解决方案。我知道下划线实现本身使用 _pluck,它内部使用 Map,所以我想看看是否可以使用 map 来做到这一点...

_.zip = function() {

     var argumentsArray = Array.prototype.slice.call(arguments);
     var longestArray = argumentsArray.sort(function(a, b) {
         return b.length - a.length
     })[0];

     //create and return an array that is as long as the longestArray:

     var zipped = Array(longestArray.length);
     // you want to push each element from each array onto an array with the length of the longestArray.

     for (var i = 0; i < longestArray.length; i++) {
         zipped[i] = _.pluck(argumentsArray, i)
     };
     return zipped;
   }

我不知道要在下面的 map 函数中返回什么。我知道我必须执行某种循环直到最长元素的长度,因为返回的数组应该那么长。我将如何在 map 内做到这一点?或者,我应该只做两个 for 循环而不是尝试使用 map 吗?

 zip = function() {

      //get the longest input argument:
      var argumentsArray = Array.prototype.slice.call(arguments);
      var longestArray = argumentsArray.sort(function(a, b) {
          return b.length - a.length
      })[0];


    //trying to use map here:

    return map(argumentsArray, function(val){
      return ?
    })

  };

  console.log(zip([1, 2, 4], [1])) 
// returns [[1, 1],[2, undefined],[4, undefined]]

最佳答案

下面我附上了原始实现的工作副本,不使用仅使用 map 的 pluck。

var zip = function() {
  var argumentsArray = Array.prototype.slice.call(arguments);
  var longestArray = argumentsArray.sort(function(a, b) {
    return b.length - a.length
  })[0];

  return longestArray.map(function(value, index, array) {
    return argumentsArray.map(function(val, i, arr) {
      return val[index];
    });
  });
};

longestArray 上的外部映射仅充当循环机制,因此更适合使用 for 循环。

内部循环映射传入的参数数组,并使用外部映射的当前索引返回每个参数数组的第 i 个元素。由于 map 已经返回一个新数组,因此内部映射的每次迭代都将返回一个包含每个参数数组的第 i 个元素的数组。

下面是使用 for 循环和映射的另一个实现。

function zip() {
  //turn args into an array
  var argumentsArray = Array.prototype.slice.call(arguments);
  var returnArr = [];

  //get length of longest array
  var length = argumentsArray.reduce(function (prev, curr) {
    //starter val is 0, if curr array is longer replace with its length
    return (prev >= curr.length) ? prev : curr.length;
  }, 0);

  //push an array of the ith element of each of the argument arrays
  //into the return array
  for (var i = 0; i < length; i++) {
    returnArr.push(argumentsArray.map(function (val) {
      return val[i];
    }));
  }

  return returnArr;
}

另请注意,我不是通过排序来查找最大的数组,而是减少数组长度以查找并返回最长的长度。

由于 js 排序是就地的,它可能会改变你的参数数组顺序。然后,返回的压缩元素数组将按其原始数组长度排序。通过这种方式,它们将按照参数数组传入的顺序排列。但这两者都是有效的 zip 实现,具体取决于您的需要。

希望这有帮助!

关于javascript - 使用映射、任意参数在 Javascript 中重建 _zip,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31682736/

相关文章:

javascript - 在 Javascript 中寻找多维数组中的匹配项

javascript - 在递归算法的 return 语句期间我的变量值如何变化?

ruby - open 关键字是 trait/mixin 吗?

f# - if-then 语句的功能替代是什么?

javascript - 如何让它像jquery一样?

javascript - 具有下划线模板分隔符的 Node 项目在 EJS View 中发生冲突

javascript - 加载时模态被 chop

javascript - 从 Javascript 中的字符串中提取特定单词

JavaScript:保存实体,可以写得更好吗?

javascript - jQuery .map 到数组中