拆分数组仍然是一个项目的阵列,而不是字符串
我有对象,那里是另一个数组作为值的属性的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.log
为updateddata
:
[
{"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()
,但它并没有任何区别。
我该如何解决?
您可以用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)
谢谢。它运作良好。我决定接受这个答案,因为你使用的方法很有趣,我不知道,所以我会继续阅读。 –
是你需要的吗?
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]
});
})
}
});
谢谢。它应该是'parent:value',因为我希望数组外的值,但是这非常重要。 –
这里我们可以使用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);
结果会打印预期结果。
谢谢,它工作正常。 –
我仍然会写信给你使用代码的答案正确,因为你有什么工作:
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更改父数组的值
我认为reduce
,concat
和map
产生更多的声明性解决方案。
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)
你应该这样做你的while循环直到0,因为你没有检查长度是否等于0你没有阅读最后一篇。 – AxelH