2017-02-03 5 views
1

Есть ли способ в lodash застегнуть два массива различных размеров, где результат будет, как этоZip массивов различного размера с использованием lodash

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

Так он должен начать только с самого начала, если один массив достигнет его end

+0

Вы говорите, вы хотели бы, чтобы второй массив, чтобы продолжать получать накинут, так что если вы имели 'а, б, в, г, е, f' вы получите' 1, b 2, c 1, d 2, e 1, f 2' ?? –

+0

Откуда взялся b? –

+0

@CallumLinington да –

ответ

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

Очень приятно. Вы могли бы даже заменить 'slice' на' take (arr1.length) ', чтобы иметь еще один параметр. –

+0

@GruffBunny - спасибо. –

1

Вы можете использовать функцию _.zipWith, что позволяет изменять результат почтового индекса.

Затем вы можете устранить проблему с размером по нескольким причинам. В этом случае я вычисляю разницу в размерах и использую ее для предоставления значения, когда обратный вызов функции получает неопределенное значение (это происходит, когда размер одного из массивов превышен).

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>

Смежные вопросы