2013-06-02 3 views
4

У меня есть массив какСплит массивов на основе последовательностей Javascript

var arr = [12, 13, 14, 17, 18, 19, 20] 

мне было интересно, как я мог перебирать массив, так что я могу разделить этот массив в 2 массивы на основе последовательностей? т.е. в основном, если i+1 != true сделать новый массив

var arr = [12, 13, 14] 
var arr2 = [17,18,19,20] 

Я использую lodash и попытались ряд for заявлений с помощью splice но Im получение немного запутался? Цените любую помощь

+1

немного больше информации, пожалуйста, как вы хотите разделить - раскол после 3-х элементов довольно легко, что все, что вам нужно ? – luk2302

+0

2 массива с равными половину? – iraycd

+0

Мне нужен раскол, чтобы узнать, когда последовательность остановилась? то есть 12, 13, 14 - после этого происходит разрыв, и последовательность не начинается снова до 17, 18, 19. i.e. 'i + 1! = true, разделенная на новый массив'? – Andy

ответ

2

Вот другой, более плотный подход, который использует Underscore довольно удобно groupBy и values методы:

var origin = [12,13,14,15,17,18,19,21,22,23]; 
var c = 0, result = _.values(_.groupBy(origin, function(el, i, arr) { 
    return i ? c+= (1 !== el - arr[i-1]) : 0; })); 

Как результат, result архив будет содержать все последовательности в качестве элементов. Вот JSFiddle играть.

Пояснение: groupBy группы, источник массив с помощью обратного вызова (который возвращает новый порядковый номер каждый раз, когда разность между текущим обрабатываемым элементом (el) и предыдущим (arr[i-1]) больше, чем 1. Это возвращает объект, хотя, так что я должен поставить его через _.values;.? вы можете или не может этот шаг

Интересно, что можно просить что-то вроде groupByInArray функции должны быть просто реализовать, но может быть очень полезным в такие ситуации.

+0

отлично! спасибо кучи. да, я думаю, что что-то вроде groupBy было бы здорово. У меня даже есть сценарий вроде [[12, 0], [13, 0], [14, 0], [18,0], [19,1], [20,0]] ', где мне нужно разделить это тоже ? Таким образом, это похоже на [[12, 0], [13, 0], [14, 0]] и '[[18,0], [19,1], [20,0]]' – Andy

+0

Если я понимаю вы можете повторно использовать эту функцию с небольшим изменением: замените проверку 'el-arr [i-1]' на 'el [0] - arr [i-1] [0]'. [Demo] (HTTP: // jsfiddle.net/aL8ht /) – raina77ow

+0

Да, потрясающе! спасибо кучи. Мне просто интересно, я имею в виду, если бы у вас был 'groupByInArray', который также поддерживал бы эти сценарии! Было бы нереальным добавить underscore lib – Andy

0

Вы имеете в виду как this?

function split(arr) { 
    var res = []; 
    var subres = []; 
    for (var i = 0; i < arr.length; i++) { 
     var length = subres.length; 
     if (length === 0 || subres[length - 1] === arr[i] - 1) { 
      subres.push(arr[i]); 
     } else { 
      res.push(subres); 
      subres = [arr[i]]; 
     } 
    } 
    res.push(subres); 
    return res; 
} 
+0

да! большое спасибо. im не уверен, можно ли это сделать быстрее, используя lodash или подчеркивание, если вы знакомы с ними? – Andy

+1

@ Энди, использующая любую библиотеку, не сделает ничего быстрее. – Pointy

0

попробовать это :)

var array = [12,13,14,4567,789,0]; //e.g. 
var index; 
var previous = array[0]; 
for (var index = 1; index++; index < array.length) { 
    if (previous + 1 == array[index]) { 
    previous = array[index]; //++ 
    } else { 
    break; 
    } 
} 
var firstPart = array.slice(0, index + 1); 
var secondPart = array.slice(index + 1); 

http://jsfiddle.net/zajnH/

1

Example on jsFiddle

var a = [1, 2, 3, 5, 6, 7]; 

var r = []; 
var t = []; 

for (var i = 0; i < a.length; ++i) 
{ 
    if (i == 0) 
    { 
     t.push(a[i]); // add the first element and continue 
     continue; 
    } 
    if (a[i - 1] != (a[i] - 1)) 
    { 
     // if the current is not sequential 
     // add the current temporary array to arrays result 
     r.push(t); 

     // clear the temporary array and start over 
     t = []; 
    } 

    t.push(a[i]); 
} 
r.push(t); 

r будет содержать все ваши массивы

Minified version

function seq(e,t,n,r){t=[];n=[];for(r=0;r<e.length;++r){if(!r){n.push(e[r]);continue}if(e[r-1]!=e[r]-1){t.push(n);n=[]}n.push(e[r])}t.push(n);return t} 

var result = seq([1, 2, 3, 5, 6, 7]); 
Смежные вопросы