0

現在の配列から孤立 (一致しないペア) を削除したい:

J01171 01/11/2012 08:03:34 J01171 Bath Rd Ipswich Reconnected  
J01171 01/11/2012 08:04:34 J01171 Bath Rd Ipswich Isolated by OTU Fault   
J01171 01/11/2012 08:04:47 J01171 Bath Rd Ipswich Reconnected   
J01171 02/01/2013 15:46:22 J01171 Bath Rd Ipswich Isolated by OTU Fault   
J01171 02/01/2013 15:46:36 J01171 Bath Rd Ipswich Reconnected  
J01171 01/02/2013 18:12:43 J01171 Bath Rd Ipswich Isolated by OTU Fault  
J01171 01/02/2013 18:42:32 J01171 Bath Rd Ipswich Reconnected   
J01181 10/12/2012 13:13:13 J01181 BathRd LeighRd Isolated by Fault    
J01181 10/12/2012 15:30:01 J01181 BathRd LeighRd Reconnected     
J01181 09/02/2013 00:43:00 J01181 BathRd LeighRd Isolated by OTU Fault     
J01181 09/02/2013 00:47:57 J01181 BathRd LeighRd Reconnected   
J01181 09/02/2013 00:49:00 J01181 BathRd LeighRd Isolated by OTU Fault

オーファンを削除すると、出力は次のようになります。

J01171 01/11/2012 08:04:34 J01171 Bath Rd Ipswich Isolated by OTU Fault   
J01171 01/11/2012 08:04:47 J01171 Bath Rd Ipswich Reconnected   
J01171 02/01/2013 15:46:22 J01171 Bath Rd Ipswich Isolated by OTU Fault   
J01171 02/01/2013 15:46:36 J01171 Bath Rd Ipswich Reconnected  
J01171 01/02/2013 18:12:43 J01171 Bath Rd Ipswich Isolated by OTU Fault  
J01171 01/02/2013 18:42:32 J01171 Bath Rd Ipswich Reconnected   
J01181 10/12/2012 13:13:13 J01181 BathRd LeighRd Isolated by Fault    
J01181 10/12/2012 15:30:01 J01181 BathRd LeighRd Reconnected     
J01181 09/02/2013 00:43:00 J01181 BathRd LeighRd Isolated by OTU Fault     
J01181 09/02/2013 00:47:57 J01181 BathRd LeighRd Reconnected

ソートされた配列内のすべての要素は、すべての資産コードに対して「分離 - 再接続」のペアになります。ただし、配列には一部の資産コードの孤立があります。上部には一致しない「再接続」があり (その「分離」ペアが他のログ ファイルに残っているため)、下部には一致しない「分離」があります。 (その「再接続」ペアは将来のログ ファイルに記録されるため)。私の仕事は、すべての孤児を取り除くことです。ここには 2 つの資産コードしか入れていませんが、実際には配列内に 50 万の要素を持つ数百 (または数千) の資産コード、つまり数百の孤立した資産コードがあります。

オーファンは、資産コードの途中でも発生する可能性があります。基本的に、任意のアセット コードの途中で 3 つの「Isolated」が続く場合があります。最初の 'Isolated' の後に続く 'Isolated' を削除する必要があります。これはまだペアを取得していないためです。例えば、

X00000 dd/mm/yyyy hh:mm:ss X00000 qwerty Isolated    
X00000 dd/mm/yyyy hh:mm:ss X00000 qwerty Isolated [NEEDS TO BE REMOVED]     
X00000 dd/mm/yyyy hh:mm:ss X00000 qwerty Isolated  [NEEDS TO BE REMOVED]    
X00000 dd/mm/yyyy hh:mm:ss X00000 qwerty Reconnected    
J00000 dd/mm/yyyy hh:mm:ss X00000 qwerty Isolated    
J00000 dd/mm/yyyy hh:mm:ss X00000 qwerty Isolated [NEEDS TO BE REMOVED]        
J00000 dd/mm/yyyy hh:mm:ss X00000 qwerty Reconnected    
J00000 dd/mm/yyyy hh:mm:ss X00000 qwerty Reconnected  [NEEDS TO BE REMOVED]

この問題に対処するためのアイデアはありますか? 前もって感謝します。

4

2 に答える 2

1

このフィドルは期待どおりに動作するようです:

var orph_arr = [
    "J01171 01/11/2012 08:03:34 J01171 Bath Rd Ipswich Reconnected",
    "J01179 01/11/2012 08:04:34 J01179 Bath Rd Ipswich Isolated by OTU Fault",  // Note: this guy is an orphan according to the OP's definition
    "J01171 01/11/2012 08:04:34 J01171 Bath Rd Ipswich Isolated by OTU Fault",
    "J01171 01/11/2012 08:04:47 J01171 Bath Rd Ipswich Reconnected",
    "J01171 02/01/2013 15:46:22 J01171 Bath Rd Ipswich Isolated by OTU Fault",
    "J01171 02/01/2013 15:46:36 J01171 Bath Rd Ipswich Reconnected",
    "J01171 01/02/2013 18:12:43 J01171 Bath Rd Ipswich Isolated by OTU Fault",
    "J01171 01/02/2013 18:42:32 J01171 Bath Rd Ipswich Reconnected",
    "J01181 10/12/2012 13:13:13 J01181 BathRd LeighRd Isolated by Fault",
    "J01181 10/12/2012 15:30:01 J01181 BathRd LeighRd Reconnected",
    "J01181 09/02/2013 00:43:00 J01181 BathRd LeighRd Isolated by OTU Fault",
    "J01181 09/02/2013 00:47:57 J01181 BathRd LeighRd Reconnected",
    "J01181 09/02/2013 00:49:00 J01181 BathRd LeighRd Isolated by OTU Fault"];



for (var i = 0; i < orph_arr.length - 1; i++) {
    var asset1 = orph_arr[i].match(/[A-Z]{1}\d{5}/);
    var asset2 = orph_arr[i + 1].match(/[A-Z]{1}\d{5}/);
    var isolated1 = orph_arr[i].match(/\b(Isolated)\b/gi);
    var isolated2 = orph_arr[i + 1].match(/\b(Isolated)\b/gi);
    var reconnected1 = orph_arr[i].match(/\b(Reconnected)\b/gi);
    var reconnected2 = orph_arr[i + 1].match(/\b(Reconnected)\b/gi);

    if ((asset1[0] !== asset2[0]) && (reconnected1) && (reconnected2)) {
        orph_arr[i + 1] = "REMOVED";
    }
    if ((asset1[0] !== asset2[0]) && (isolated1) && (isolated2)) {
        orph_arr[i] = "REMOVED";
    }
}

console.dir(orph_arr);

孤児を削除するのではなく、置き換えるだけで単純化しましたが、明らかに代わりに削除することもできます(単純に削除するorph_arr.splice(i,1);必要があります)。ただし、反復中にリストから削除しない方が一般的には良いと思います. インデックスを台無しにする傾向があります。

これは、実際に置き換えるのではなく削除するフィドルです。配列のインデックスを元に戻すことがいかに重要であるかに注意してください。

于 2013-06-11T15:34:33.070 に答える