我有以下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对象长度的所需输出背后的逻辑为了实现所需的输出,我使用了unshift
和push
操作。这是我想要的输出的例证。
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)
答案 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)
这使用reduce
和map
,可能需要使用外部库来处理。
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;
这可以通过已经显示的一些方法进一步优化。