在lodash中是否有一种方法可以压缩两个不同大小的数组,结果就是这个
_.zip(['a', 'b', 'c'], [1,2]) -> [['a', 1], ['b', 2], ['c', 1]]
因此,如果一个数组到达其末尾,它应该从头开始
答案 0 :(得分:3)
您可以创建一个新数组,其中将重复第二个数组,然后使用原始数组_zip()
。
该示例假定第二个数组是较短的数组。
function repeatingZip(arr1, arr2) {
var ratio = Math.ceil(arr1.length / arr2.length); // how many times arr2 fits in arr1
var pattern = _(new Array(ratio)) // create a new array with the length of the ratio
.fill(arr2) // fill each item with the 2nd array
.flatten() // flatten it to an array
.take(arr1.length) // remove redundant items
.value();
return _.zip(arr1, pattern);
}
var result = repeatingZip(['a', 'b', 'c', 'd', 'e'], [1,2]);
console.log(result);
<script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.4/lodash.min.js"></script>
答案 1 :(得分:1)
您可以使用_.zipWith功能来修改zip的结果。
然后,您可以通过多种方式解决尺寸问题。在这一个中,我计算了大小差异,并在函数回调获得未定义的值时使用它来提供一个值(当超出其中一个数组的大小时会发生这种情况)。
var idxWrp = function(arr1, arr2) {
var index = 0,
diff = Math.abs(_.size(arr1) - _.size(arr2)) - 1;
return function(a, b) {
a = _.isUndefined(a) ? arr1[index % diff] : a;
b = _.isUndefined(b) ? arr2[index % diff] : b;
index++;
return [a, b];
};
},
arr1 = [1, 2, 3],
arr2 = [1, 2, 3, 4, 5, 6, 7],
res = _.zipWith(arr1, arr2, idxWrp(arr1, arr2));
console.log(res);
<script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.4/lodash.min.js"></script>