我正在尝试创建一个可以转换此数组的递归函数:
const originalObj = {
field: "parent",
msg:[{
field: "child1a",
msg: [{
field: "child2a",
msg: "child2a-msg"
},
{
field: "child2b",
msg: "child2b-msg"
}
]
}, {
field: "child1b",
msg: "child1b-msg"
}
]
};
进入这一个:
[
{
field: "parent",
msg: [
{
field: "child1a",
msg: [
{
field: "child2a",
msg: "child2a-msg"
}
]
},
]
},
{
field: "parent",
msg: [
{
field: "child1a",
msg: [
{
field: "child2b",
msg: "child2b-msg"
}
]
},
]
},
{
field: "parent",
msg: [
{
field: "child1b",
msg: "child1b-msg"
}
]
}
]
因此,要明确:msg对象可以是字符串也可以是单个项目数组。
它应该是递归的;因为msg-object可以包含一个数组,该数组可以包含一个更深的msg-object,它可以包含另一个数组等。
这是我的尝试,但我无法弄清楚。 https://jsfiddle.net/rnacken/42e7p8hz/31/
正如你在小提琴中看到的那样,数组是嵌套的,父节点是缺失的,我错过了一个孩子。恐怕我迷失了,走错了路。
答案 0 :(得分:1)
您可以迭代msg
并构建嵌套项的新嵌套部分结果。然后迭代并为结果数组构建单个对象。
function getSingle({ field, msg }) {
var array = [];
if (!msg || !Array.isArray(msg)) {
return [{ field, msg }];
}
msg.forEach(o => getSingle(o).forEach(s => array.push({ field, msg: [s] })));
return array;
}
var object = { field: "parent", msg: [{ field: "child1a", msg: [{ field: "child2a", msg: [{ field: "child3a", msg: "child3a-msg" }, { field: "child3b", msg: "child3b-msg" }] }, { field: "child2b", msg: "child2b-msg" }] }, { field: "child1b", msg: "child1b-msg" }] };
console.log(getSingle(object));
.as-console-wrapper { max-height: 100% !important; top: 0; }
答案 1 :(得分:-1)
我添加了一个可以使用的简单递归方法。
const originalObj = {
field: "parent",
msg: [
{
field: "child1a",
msg: [
{
field: "child2a",
msg: "child2a-msg"
},
{
field: "child2b",
msg: "child2b-msg"
}
]
},
{
field: "child1b",
msg: "child1b-msg"
}
]
};
const flatten = ({field, msg}) => {
const res = []; // creating an array to create the msg array in case of multiple entries in msg
if (typeof msg === "string") {
return {field, msg}; // return plain object if the msg is "string"
}
if (msg.constructor === Array) {
// recursion here
msg.map(message => flatten(message, msg))
.forEach(m => {
// after flattening array msg, we push them to msg field
res.push({field, msg: m})
});
}
return res; // returning final result here
}
const newObj = flatten(originalObj);
使用flatten
函数,您可以映射任何数组深度并期望得到相同的结果。