2013-10-04 4 views
2

Интересно, что такое идиома, которая используется в lodash для перестройки массивов?Как изменить форму массива с помощью lodash

В принципе, я искал что-то, что превращает этот массив: [1, 2, 3, 4, 5, 6, 7, 8] к это один (в данном случае мы сгруппированы каждый 3, но предположим, что мы группируем каждый N) [[1, 2, 3], [4, 5, 6], [7, 8]]

Я не очень хорошо, как это должно быть сделано в чистом виде js, но все мои попытки переписать его в lodash хорошо, менее читаемы в конце концов.

+0

Возможный дубликат [Разделить javascript-массив в кусках, используя underscore.js] (http://stackoverflow.com/questions/8566667/split-javascript-array-in-chunks-using-underscore-js) – Bergi

+0

Я думаю, что это является [чистой задачей JS] (http://stackoverflow.com/questions/8495687/split-array-into-chunks), любое использование методов lodash сделает его значительно медленнее. Если вы хотите использовать его в библиотеке, ['.mixin()'] (http://lodash.com/docs#mixin) чистая реализация. – Bergi

+1

@ Bergi, ну, хотя я согласен с обоими вашими предположениями - да, лучше быть чистым js и да, это значительно медленнее, я просто хотел узнать, тем не менее, как это можно сделать. – shabunc

ответ

6

Простое решение:

function reshape(array, n){ 
    return _.compact(array.map(function(el, i){ 
     if (i % n === 0) { 
      return array.slice(i, i + n); 
     } 
    })) 
} 

Простой рекурсивный решение:

function reshape(array, n) { 
    if (array.length === 0) 
     return []; 
    return [_.take(array, n)].concat(reshape(_.rest(array, n), n)); 
} 
+0

Я могу представить, что вы ожидаете чистого лайнера в lodash, но я не могу придумать его. Я могу придумать чистый js-вкладыш с использованием 'reduce', но это обман. – Denis

+0

Спасибо! Это очень близко к тому, что я, наконец, придумал, но я надеялся, что это только потому, что я не являюсь пользователем hardcore lodash) – shabunc

+1

Я добавил гораздо более эффективное решение, но которое использует только ' _.compact' от lodash. – Denis

1

Вы можете также использовать _.transform:

function reshape (array, n) { 
    return _.transform(array, function (result, el, i, arr) { 
     return i % n === 0 ? result.push(arr.slice(i, i + n)) : null; 
    }); 
} 
5

Немного поздно, но в качестве дополнительного примера можно использование zip.

Например:

.zip.apply (, _.chunk ("Ваш массив", "столбцы"));

Как это работает:

Допустим, у вас есть массив = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, и т. д.]

_.chunk (массив, 3) даст вам [[1,2,3], [4,5,6], [7,8,9], [10,11,12], [13, 14]]

.zip.apply (, _.chunk (array, 3)); даст вам: [[1,4,7,10,13], [2,5,8,11,14], [3,6,9,12]]

https://lodash.com/docs#chunk

https://lodash.com/docs#zip

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