如何比较二维数组和一维数组以及在Java脚本中存储另一个数组中的公共数据

时间:2016-05-05 13:44:09

标签: javascript

我有2个阵列,一个是2维,另一个是1维。我需要比较两者并需要在另一个数组中存储公共数据。我尝试了以下方法: -

tw.local.listtodisplayNW = new tw.object.listOf.listtodisplayNWBO();
//if(tw.local.SQLResults[0].rows.listLength >
//    tw.local.virtualServers.listLength)
var k=0;
for (var i=0;i<tw.local.SQLResults[0].rows.listLength;i++)  
{
log.info("Inside SQLResults loop - For RuntimeID: " 
+tw.local.SQLResults[0].rows[i].data[3]);
for(var j=0;j<tw.local.virtualServers.listLength;j++)
{
    log.info("Inside API loop - For RuntimeID: " 
+tw.local.virtualServers[j].runtimeid);
    if(tw.local.SQLResults[0].rows[i].data[3] == 
tw.local.virtualServers[j].runtimeid)
    {
        tw.local.listtodisplayNW[k] = new tw.object.listtodisplayNWBO();
        tw.local.listtodisplayNW[k].vsysName = 
tw.local.virtualServers[j].virtualSystemName;
        tw.local.listtodisplayNW[k].vsysID = 
tw.local.virtualServers[j].virtualSystemId;
        tw.local.listtodisplayNW[k].serverName = 
tw.local.virtualServers[j].serverName;
        tw.local.listtodisplayNW[k].serverID = 
tw.local.virtualServers[j].serverId;
        tw.local.listtodisplayNW[k].runtimeID = 
tw.local.virtualServers[j].runtimeid;
        //tw.local.listtodisplayNW[k].IPAddress = 
tw.local.virtualServers[j].nics[j].ipAddress;
        log.info("VsysName: 
"+tw.local.listtodisplayNW[k].vsysName+"RuntimeID: 
"+tw.local.listtodisplayNW[k].runtimeID);
        //tw.local.listtodisplayNW[k] = new 
tw.object.listtodisplayNWBO();
        tw.local.listtodisplayNW[k].currentSpeed = 
tw.local.SQLResults[0].rows[i].data[5];
        log.info("VsysName: 
"+tw.local.listtodisplayNW[k].vsysName+"RuntimeID: 
"+tw.local.listtodisplayNW[k].runtimeID+"CurrentSpeed: 
"+tw.local.listtodisplayNW[k].currentSpeed);
        if(tw.local.listtodisplayNW[k].currentSpeed != "100 Mbps")
        {
           tw.local.listtodisplayNW[k].desiredSpeed = "100 Mbps";
         }
        else
        {
           tw.local.listtodisplayNW[k].desiredSpeed = "1 Gbps";
        }
        log.info("DesiredSpeed: 
 "+tw.local.listtodisplayNW[k].desiredSpeed);
        k++; 
     }

 }
 log.info("Length of 
 listtodisplayNW"+tw.local.listtodisplayNW.listLength);
 } 

在上面的代码中,SQLResults是一个二维数组,而virtualServers是一维数组。 我需要比较这些数组和普通数据需要存储在另一个数组中。这里的表现并不好。有没有其他方法可以有效地做到这一点。请提出需要帮助,并提前致谢。

2 个答案:

答案 0 :(得分:0)

假设整数数据,下面的例子适用于集合交集的数组实现主题,它将处理性能。

  1. 将2D数组转换为1D。

    var 2DtoIDArray =  2DArray.join().split(",");
    
  2. 创建一个名为 marker 的数组,其目的是作为查找该元素。 这需要按如下方式完成。

    遍历较小的数组,说 1DArray ,并在整个迭代过程中按如下方式设置标记

    marker[1DArray[counter]]='S1';
    

    现在迭代2Dto1DArray数组(你可以使用嵌套循环迭代,如果你不想将它转换为1 dimesnional)和每个元素 这个数组检查它是否标记为&#39; S1&#39;在标记查找数组中。 如果是,请继续添加 commonElementsArray 中的元素。

答案 1 :(得分:0)

遵循这个简单的方法

  1. 由于匹配条件只是两个大数组之间的匹配条件,因此创建两个映射(每个数组一个)以将每个记录映射到要匹配的属性
  2. SQLResults

    var map1 = {};
    tw.local.SQLResults[0].rows.each( function(row){
      map1[ row.data[3] ] = row;
    });
    

    ,类似于虚拟服务器

    var map2 = {};
    tw.local.virtualServers.each( function(vs){
      map2[ vs.runtimeid ] = vs;
    });
    
    1. 现在将这两个地图wrt迭代到其键并设置新数组中的值
    2. 新数组是tw.local.listtodisplayNW

      tw.local.listtodisplayNW = [];
      Object.keys( map1 ).forEach( function( key ){
         if( map2[ key ] )
         {
           //set the values in tw.local.listtodisplayNW 
         }
      })
      

      方法的复杂性只是O(n),因为没有嵌套循环。