我正在努力学好 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/