使用lodash的不同大小的Zip阵列

时间:2017-02-03 13:21:29

标签: javascript lodash

在lodash中是否有一种方法可以压缩两个不同大小的数组,结果就是这个

_.zip(['a', 'b', 'c'], [1,2]) -> [['a', 1], ['b', 2], ['c', 1]]

因此,如果一个数组到达其末尾,它应该从头开始

2 个答案:

答案 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>