使用地图、任意参数重建 Javascript 中的 _zip

Rebuilding _zip in Javascript using map, arbitrary arguments

我正在努力学习 JavaScript 并且正在练习重建一些下划线函数。我正在尝试使用具有任意数量参数的 map 重建 zip。这是我用 pluck 想出的解决方案。我知道下划线实现本身使用 _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;
   }

我对下面地图函数中 return 的内容感到困惑。我知道我必须做某种循环直到最长元素的长度,因为 returned 数组应该那么长。我将如何在地图中做到这一点?或者,我应该只做两个 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]]

下面我附上了你的原始实现的工作副本,没有使用仅使用地图的 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 循环。

内部循环映射传入的参数数组,并使用外部映射的当前索引,returns 每个参数数组的第 i 个元素。由于映射已经 return 一个新数组,内部映射的每次迭代都将 return 一个包含每个参数数组的第 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;
}

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

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

希望对您有所帮助!