匹配javascript对象的长度

时间:2015-06-01 18:39:40

标签: javascript

我有以下javascript对象:

输入

data=[];
data[0]=[{"value":29},{"value":44}]
data[1]=[{"value":16}]
data[2]=[{"value":13},{"value":11},{"value":1}]
data[3]=[{"value":13},{"value":11}]

通过添加{value:0}来匹配javascript对象长度的所需输出背后的逻辑为了实现所需的输出,我使用了unshiftpush操作。这是我想要的输出的例证。

data1 0 0 0

0 data2 0 0

0 0 data3 0
0 0 0 data4

所需输出

data[0]=[{"value":29},{"value":44},{"value":0},{"value":0},{"value":0},{"value":0},{"value":0},{"value":0}]
data[1]=[{"value":0},{"value":0},{"value":16},{"value":0},{"value":0},{"value":0},{"value":0},{"value":0}]
data[2]=[{"value":0},{"value":0},{"value":0},{"value":13},{"value":11},{"value":1},{"value":0},{"value":0}]
data[3]=[{"value":0},{"value":0},{"value":0},{"value":0},{"value":0},{"value":0}{"value":13},{"value":11}]

当前输出:

如果查看data[2],结果会出乎意料。我无法处理这个问题。

data[0]=[{"value":29},{"value":44},{"value":0},{"value":0},{"value":0},{"value":0},{"value":0},{"value":0}]
data[1]=[{"value":0},{"value":0},{"value":16},{"value":0},{"value":0},{"value":0},{"value":0},{"value":0}]
data[2]=[{"value":13},{"value":11},{"value":1},{"value":0},{"value":0},{"value":0},{"value":0},{"value":0}]
data[3]=[{"value":0},{"value":0},{"value":0},{"value":0},{"value":0},{"value":0}{"value":13},{"value":11}]

这是 FIDDLE

data=[];
data[0]=[{"value":29},{"value":44}]
data[1]=[{"value":16}]
data[2]=[{"value":13},{"value":11},{"value":1}]
data[3]=[{"value":13},{"value":11}]
debugger;
console.log(data);
alllength=0
for (i=0;i<data.length;i++)
{
    m= Object.keys(data[i]).length;
    alllength=alllength+m;
}

console.log(alllength);

for (i=0;i<data.length;i++)
{
   if(i==0)
   {
       m=Object.keys(data[i]).length;
       for(j=0;j<alllength-m;j++)
       {
           data[i].splice(m+j+1, 0, {"value":0});
       }
   }

   else if(i==data.length-1)
   {
       n=Object.keys(data[i]).length;
       for(j=0;j<alllength-n;j++)
       {
           data[i].unshift({"value":0});
       }

   }

   else
   {
     self.n="";
     k=Object.keys(data[i-1]).length;
     for (n=0;n<k;n++)
     {
         if(data[i-1][n].value==0)
         {
             console.log(n);
             for(j=0;j<n;j++)
             {
                data[i].unshift({"value":0});
             }

              m=Object.keys(data[i]).length;
              for(j=0;j<alllength-m;j++)
              {
                 data[i].splice(m+j+1, 0, {"value":0});
              }
             break;
        }
    }
  }
}
console.log(data)

3 个答案:

答案 0 :(得分:5)

好的,这里有一些事情。

1)您将通过调用数组上的Object.keys来增加算法的时间复杂度。 Data [i]是一个对象数组,因此调用data [i] .length将正常工作而不是Object.keys(data [i])。length。数组分别跟踪长度,其中调用Object.keys将在引擎盖下进行多项操作,这会降低算法速度

2)你的问题在于:在第43行,你将n设置为零

for (n=0;n<k;n++)

然后,检查前一个数组中对象的值是否等于零

if(data[i-1][n].value==0)

当n === 0时,这将是真的,因为前一个数组中的前几个对象具有等于0的值。

接下来,您将通过并添加必要的0值对象,以使用此代码

创建所需的结构
for(j=0;j<n;j++)
         {
            data[i].unshift({"value":0});
         }

之后,添加非零值并打破循环 问题是,当n === 0并且您使前一个for循环for(j=0;j<n;j++)时,基本上你会说for(j=0, j< 0; j++)跳过for循环

执行if语句,跳过零值块,直接添加值

答案 1 :(得分:3)

data=[];
data[0]=[{"value":29},{"value":44}]
data[1]=[{"value":16}]
data[2]=[{"value":13},{"value":11},{"value":1}]
data[3]=[{"value":13},{"value":11}]
debugger;
console.log(data);
alllength=0
for (i=0;i<data.length;i++)
{
    m= Object.keys(data[i]).length;
    alllength=alllength+m;
}

offset= 0;
for (i=0;i<data.length;i++)
{
    m=Object.keys(data[i]).length;

    for (j=0;j<offset;j++) {
       data[i].unshift({"value":0});
    }
    offset+= m;

    while (Object.keys(data[i]).length < alllength) {
       data[i].push({"value":0});
    }  
 }

答案 2 :(得分:3)

这使用reducemap,可能需要使用外部库来处理。

&#13;
&#13;
var data=[];
data[0]=[{"value":29},{"value":44}]
data[1]=[{"value":16}]
data[2]=[{"value":13},{"value":11},{"value":1}]
data[3]=[{"value":13},{"value":11}]

var totalLength = data.reduce(function(length, item) { 
 return length + item.length; 
}, 0);
    
var key = 0; 
data = data.map(function(item) { 
var out = []; 
for (var i = 0; i < totalLength; i++) { 
    out.push({value: 0}); 
} 
out.splice.apply(out, [key, item.length].concat(item)); 
key += item.length;  
return out; 
});

console.log(data);
&#13;
&#13;
&#13;

这可以通过已经显示的一些方法进一步优化。