从数组javascript中删除不匹配对

从数组javascript中删除不匹配对,javascript,arrays,Javascript,Arrays,我想从当前阵列中删除孤立项(非匹配对): 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:2

我想从当前阵列中删除孤立项(非匹配对):

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万个元素,因此有数百个孤儿

孤儿也可能出现在资产代码的中间。基本上,当任何给定的资产代码中间,三个“隔离”会互相跟踪。我需要删除第一个“Isolated”之后的以下“Isolated”-s,因为它还没有得到它的对。比如说,

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]
有什么办法解决这个问题吗?提前感谢。

这似乎像预期的那样起作用:

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);
var orph\u arr=[
“J01171 01/11/2012 08:03:34 J01171巴斯路伊普斯维奇重新连接”,
“J01179 01/11/2012 08:04:34 J01179巴斯路伊普斯维奇被OTU断层隔离”//注:根据OP的定义,这家伙是孤儿
“J01171 01/11/2012 08:04:34 J01171巴斯路伊普斯维奇被OTU故障隔离”,
“J01171 01/11/2012 08:04:47 J01171巴斯路伊普斯维奇重新连接”,
“J01171 02/01/2013 15:46:22 J01171巴斯路伊普斯维奇被OTU故障隔离”,
“J01171 02/01/2013 15:46:36 J01171巴斯路伊普斯维奇重新连接”,
“J01171 01/02/2013 18:12:43 J01171巴斯路伊普斯维奇被OTU故障隔离”,
“J01171 01/02/2013 18:42:32 J01171巴斯路伊普斯维奇重新连接”,
“J01181 10/12/2012 13:13:13 J01181 BathRd-LeighRd被故障隔离”,
“J01181 10/12/2012 15:30:01 J01181 BathRd LeighRd重新连接”,
“J01181 09/02/2013 00:43:00 J01181 BathRd LeighRd被OTU故障隔离”,
“J01181 09/02/2013 00:47:57 J01181 BathRd LeighRd重新连接”,
“J01181 09/02/2013 00:49:00 J01181 BathRd LeighRd被OTU断层隔离”];
对于(变量i=0;i
我只是通过替换孤立项而不是删除它们来简化它,但显然它们可以被删除(一个简单的
orph_arr.splice(I,1);
应该可以做到),尽管我认为在迭代时不从列表中删除它们通常会更好。它往往会弄乱你的索引


这是一个实际删除而不是替换的。请注意,将数组索引设置回原来的位置非常重要,否则将丢失两个连续的孤立项。

我认为这正是您想要的:

isolated = {} 

result = data.reduce(function(buf, line) {
    var m = line.match(/(^[A-Z]\d{5}).*?(Reconnected|Isolated)/);
    var asset = m[1], event = m[2];

    if(event == "Reconnected" && asset in isolated) {
        buf[isolated[asset]] = buf[isolated[asset]].substr(1);
        delete isolated[asset];
        buf.push(line);
    } else if(event == "Isolated") {
        isolated[asset] = buf.push("?" + line) - 1;
    }
    return buf;
}, []). filter(function(line) {
    return line.charAt(0) != "?";
})
这个想法是跟踪“隔离”线路,并在找到匹配的“重新连接”后“恢复”清理。请注意,此代码不要求“隔离”后面紧跟“重新连接”,并且可以处理具有来自不同资产的混合输出的日志


完全小提琴:

它以什么方式不起作用?@Paulpro不会移除所有孤儿它不会移除哪些孤儿?只是文件中的随机孤儿?开头还是结尾?您确定您的文件总是在“隔离”之后加上“重新连接”吗?或者你可以让两个(或更多)的“孤立”在一行吗?还有,
removeA
实际上做什么?因为如果它在您迭代数组时从数组中删除元素,它可能会导致问题。@MattBurland它确实删除了元素。你为什么认为这会引起问题
removeA=function(arr){var-what,a=arguments,L=a.length,ax;while(L>1&&arr.length){what=a[--L];while((ax=$.inArray(what,arr))!=-1{arr.splice(ax,1);}}返回arr;}
谢谢,@thg435。“result”变量是数组吗?我试图将其作为数组处理,但浏览器不执行我的javascript。@KananFarzali:是的,
result
是一个只包含有效行的数组。它应该等于原始数组,不包括所有孤立线。那么我该如何用你的函数替换我的循环呢?我试过了,但没用@卡南法扎利:我不明白你想达到什么目的。这是一个文件的内容。我获取内容,将其拆分为一个行数组,删除所有孤立项后,我希望它们重新加入到内容中。顺便说一句,我看到您正在使用/^[A-Z]\d{5}/来匹配资产代码,而我正在使用/[A-Z]{1}\d{5}/。哪一个更严格?不是正则表达式的专家。谢谢。事实上,我发现孤儿的资产代码也可能出现在中间。这意味着我需要一个函数来移除所有孤儿,从任何地方移除孤儿。@KananFarzali:这就是我为什么问的原因!你需要先定义问题,然后才能解决它。问题是一样的:从任何地方移除所有孤立项,而不仅仅是从资产代码的顶部和底部。@KananFarzali:不,不是。每次你发帖时,你对孤儿的定义似乎都在改变。你需要一个精确的定义,什么使一条线成为孤儿。很明显,它不是一个孤儿,仅仅因为“孤立”之后没有立即“重新连接”,但thg435的解决方案工作完美,但你说它没有