使用地图、任意参数重建 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 实现,具体取决于您的需要。
希望对您有所帮助!
我正在努力学习 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 实现,具体取决于您的需要。
希望对您有所帮助!