2012-05-16 4 views
0

Начиная с массива произвольных значений, я хотел бы иметь возможность извлекать все последовательности заданного значения. Так что, если я начал с этимИзвлечь последовательности из массива

[1,0,1,1,1,1,0,0] 

и искали 1. Я хотел бы получить назад

[[1],[1,1,1,1]] 

Я видел реализацию в AS, хотя и не достаточно ясно для меня, чтобы перевести более: finding sequences in AS3 array

ответ

1

Я написал один из нуля с кодовыми комментариев:

function makeSequence(input, val) { 
    var output = [], current = []; 

    for (var i = 0; i < input.length; i++) { 
     if (input[i] === val) { 
      // if we have a matching value, add it to 
      // the current match 
      current.push(val); 
     } else if (current.length) { 
      // no match on current value, write out 
      // any previous match 
      output.push(current); 
      current = []; 
     } 
    } 
    // when done, make sure to add the last match 
    if (current.length) { 
     output.push(current); 
    } 
    return(output); 
} 

Работа демо здесь: http://jsfiddle.net/jfriend00/YvsET/

+0

Спасибо, это хороший простой ответ – Jake

0

AS3 is based on ECMAScript, и, следовательно, почти совместим (кроме идентификаторов) и легко трансформируется в JS. Попробуйте эту преобразованную версию кода (более или менее, просто лишив идентификаторы).

var prev = '', 
    q = 0, 
    result = [], 
    numbers = [1, 0, 1, 1, 1, 1, 0, 0], 
    i; 
for (i = 0; i < numbers.length; ++i) { 
    if (prev != numbers[i]) { 
     if (q > 0) { 
      result.push(q); 
     } 
     q = 1; 
     prev = numbers[i]; 
    } else { 
     ++q; 
    } 
} 
if (q > 0) { 
    result.push(q); 
} 
0
var prev = '',q = 0, numbers = [1,0,1,1,1,1,0,0]; 
for(var i=0; i<numbers.length; i++){ 
if(prev!=numbers[i]){  
    if(q>0) 
    result.push(q); 
    q=1;  
    prev=numbers[i]; 
    } 
    else 
     q++; 
} 
if(q>0) 
    result.push(q); 
return result; 
0

просто очередная реализация с использованием filter() method: см пример скрипку http://jsfiddle.net/NNmwr/2

var data   = [1,0,1,1,1,1,0,0], 
    sequence_one = []; 
    result  = []; 

data.filter(function(d, i) { 
    var current = data[i], 
     prev = data[i-1] || 0; 

    if (current) { 
     sequence_one.push(1); 
     if (i === data.length -1) { 
      result.push(sequence_one);  
     } 
    } 
    else {  
     if (prev) { 
     result.push(sequence_one); 
     sequence_one = []; 
     } 
    } 
}) 

console.log(result); // [ [1], [1,1,1,1] ] 
Смежные вопросы