2016-08-16 62 views
1

我有对象,那里是另一个数组作为值的属性的JavaScript数组,如下所示:拆分数组仍然是一个项目的阵列,而不是字符串

var data = [ 
{ 
id: 1, 
parent: [1,2,3,4] 
}, 
{ 
id: 2, 
parent: [5,6,7,8] 
} 
] 

我想将其拆分,因此每个拥有多个父项的对象都会获取其自身的副本,每个副本都有一个不同的父项。到目前为止,我已经做到了这一点:

var updateddata = JSON.parse(JSON.stringify(data)); 

for (var i = 0; i < updateddata[i].parent.length; i++) { 
    while (updateddata[i].parent.length > 1) { 
     updateddata.push({ 
     id: updateddata[i].id, 
     parent: updateddata[i].parent[0] 
    }) 
updateddata[i].parent.shift() 
} 
} 

和它的作品完美,除了一个事实,即在做console.log(JSON.stringify(updateddata))时,我可以看到,前两个条目有一个父一个单一入口的数组,不像别人,这已经是阵列外:

这是console.logupdateddata

[ 
{"id":1,"parent":[4]}, 
{"id":2,"parent":[8]}, 
{"id":1,"parent":1}, 
{"id":1,"parent":2}, 
{"id":1,"parent":3}, 
{"id":2,"parent":5}, 
{"id":2,"parent":6}, 
{"id":2,"parent":7} 
] 

我也曾尝试使用中的值.toString(),但它并没有任何区别。

我该如何解决?

+1

你应该这样做你的while循环直到0,因为你没有检查长度是否等于0你没有阅读最后一篇。 – AxelH

回答

1

您可以用reduce()forEach()

var data = [{ 
 
    id: 1, 
 
    parent: [1, 2, 3, 4] 
 
}, { 
 
    id: 2, 
 
    parent: [5, 6, 7, 8] 
 
}] 
 

 
var result = data.reduce(function(r, ar) { 
 
    ar.parent.forEach(function(e) { 
 
    r.push({id: ar.id, parent: e}); 
 
    }); 
 
    return r; 
 
}, []); 
 

 
console.log(result)

+0

谢谢。它运作良好。我决定接受这个答案,因为你使用的方法很有趣,我不知道,所以我会继续阅读。 –

1

是你需要的吗?

var data = [ 
{ 
id: 1, 
parent: [1,2,3,4] 
}, 
{ 
id: 2, 
parent: [5,6,7,8] 
} 
] 

var updatedData = []; 

data.forEach((obj) => { 
    if (obj.parent.length > 1) { 
    obj.parent.forEach((value) => { 
     updatedData.push({ 
     id: obj.id, 
     parent: [value] 
     }); 
    }) 
    } 
}); 
+0

谢谢。它应该是'parent:value',因为我希望数组外的值,但是这非常重要。 –

1

这里我们可以使用for循环遍历数组做到这一点:

var data = [ 
{ 
id: 1, 
parent: [1,2,3,4] 
}, 
{ 
id: 2, 
parent: [5,6,7,8] 
} 
]; 
var result = []; 
for(var i=0; i<data.length; i++) { 
    var obj = data[i]; 
    for(var j=0;j<obj.parent.length; j++) { 
     result.push({id: obj["id"], parent: obj.parent[j]}); 
    } 
} 
console.log(result); 

结果会打印预期结果。

+0

谢谢,它工作正常。 –

1

我仍然会写信给你使用代码的答案正确,因为你有什么工作:

for (var i = 0; i < updateddata[i].parent.length; i++) { 
    while (updateddata[i].parent.length > 0) { // Here you should read the last one 
     updateddata.push({ 
     id: updateddata[i].id, 
     parent: updateddata[i].parent[0] 
     }) 
     updateddata[i].parent.shift() 
    } 
} 

当然,这将保持空数组开头。两种解决方案,删除后处理或当长度= 1更改父数组的值

1

我认为reduce,concatmap产生更多的声明性解决方案。

var data = [ 
 
    { id: 1, parent: [1,2,3,4] }, 
 
    { id: 2, parent: [5,6,7,8] } 
 
] 
 

 
let result = data.reduce((acc, {id, parent}) => 
 
    [...acc, ...parent.map(x => ({id, parent:x}))], []) 
 
    
 
console.log(result)

如果你定义的时间提前输出数据的形状,它使事情有点更好,但

var data = [ 
 
    { id: 1, parent: [1,2,3,4] }, 
 
    { id: 2, parent: [5,6,7,8] } 
 
] 
 

 
let shape = id => parent => ({id, parent}) 
 

 
let result = data.reduce((acc, {id, parent}) => 
 
    [...acc, ...parent.map(shape(id))], []) 
 
    
 
console.log(result)

相关问题