使用map和任意参数在Javascript中重建_-zip

使用map和任意参数在Javascript中重建_-zip,javascript,functional-programming,underscore.js,Javascript,Functional Programming,Underscore.js,我正在努力学好JavaScript,并且正在练习重建一些下划线函数。我正在尝试使用map重建zip,其中有任意数量的参数。这是我勇敢地想出的解决办法。我知道下划线实现本身使用了_pulk,它在内部使用Map,所以我想看看是否可以使用Map来实现这一点 _.zip = function() { var argumentsArray = Array.prototype.slice.call(arguments); var longestArray = argumentsArra

我正在努力学好JavaScript,并且正在练习重建一些下划线函数。我正在尝试使用map重建zip,其中有任意数量的参数。这是我勇敢地想出的解决办法。我知道下划线实现本身使用了_pulk,它在内部使用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;
   }

下面我附上了您的原始实现的工作副本,不使用仅使用地图的Pull

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已经返回一个新数组,所以内部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;
}
函数zip(){
//将args转换为数组
var argumentsArray=Array.prototype.slice.call(参数);
var returnArr=[];
//获取最长数组的长度
变量长度=argumentsArray.reduce(函数(上一个,当前){
//如果curr数组较长,则starter val为0,替换为其长度
返回值(上一个>=当前长度)?上一个:当前长度;
}, 0);
//推送每个参数数组的第i个元素的数组
//进入返回数组
对于(变量i=0;i
还要注意的是,我不是通过排序来查找最大的数组,而是通过减少数组长度来查找并返回最长的长度

由于js排序已经就位,它可能会更改参数数组顺序。然后,返回的压缩元素数组将按其原始数组长度排序。这样做,它们将按照传入参数数组的顺序进行。但这两种都是有效的zip实现,具体取决于您需要什么


希望这有帮助

你不想把
映射到
参数数组上,而是映射到
长数组上。哇,布兰登,这就是问题所在!非常感谢。
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;
}