任意の値の配列から始めて、特定の値のすべてのシーケンスを抽出できるようにしたいと考えています。だから私がこれで始めたら
[1,0,1,1,1,1,0,0]
1を検索しました。戻りたいです
[[1],[1,1,1,1]]
AS での実装を見たことがありますが、翻訳するのに十分明確ではありません: AS3 配列でのシーケンスの検索
任意の値の配列から始めて、特定の値のすべてのシーケンスを抽出できるようにしたいと考えています。だから私がこれで始めたら
[1,0,1,1,1,1,0,0]
1を検索しました。戻りたいです
[[1],[1,1,1,1]]
AS での実装を見たことがありますが、翻訳するのに十分明確ではありません: AS3 配列でのシーケンスの検索
コードコメントを付けてゼロから書きました:
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/
filter() メソッドを使用した別の実装: fiddle の例を参照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] ]
AS3 は 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);
}
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;