我有一个对象
obj1
,它具有映射信息,该信息以值vals
的形式存在于其他对象中。我能够创建平面对象结构,但递归不起作用,因此需要帮助
const obj1 = [
{
mapping: "cities",
},
{
mapping: "category",
children: {
mapping: "type",
children: {
mapping: "otherType",
},
},
},
{
mapping: "age",
},
];
const vals = [
{
mapping: "category",
values: [{}],
},
{
mapping: "type",
values: [{}],
},
{
mapping: "otherType",
values: [{}],
},
{
mapping: "cities",
values: [{}],
},
{
mapping: "age",
values: [{}],
},
];
我想要以下来源的预期数据
const exectedData = {
cities: {
values: [{}],
},
category: {
values: [{}],
children: {
type: {
values: [{}],
children: {
otherType: {
values: [{}],
}
}
}
}
},
age: {
values: [{}]
}
}
通过下面的方法,我可以创建平面数据,但递归数据不属于
children
属性
const processItem = (config, vals) => {
const isDataAvailable = vals.find(
(item) => item.category === config.category,
);
if (isDataAvailable) {
if (config.children) {
processItem(config.children, vals);
}
const { mapping } = config;
finalData.push({
mapping,
values: isDataAvailable.values,
});
}
};
config.forEach((config) => processItem(config, values));
您可以将值转换为对象,以便更快地更新值查找并进行简单的递归:
const obj = [
{
mapping: "cities",
},
{
mapping: "category",
children: {
mapping: "type",
children: {
mapping: "otherType",
},
},
},
{
mapping: "age",
},
];
const vals = [
{
mapping: "category",
values: [{}],
},
{
mapping: "type",
values: [{}],
},
{
mapping: "otherType",
values: [{}],
},
{
mapping: "cities",
values: [{}],
},
{
mapping: "age",
values: [{}],
},
];
const map = vals.reduce((r, {mapping, ...item}) => (r[mapping] = item, r), {});
const update = obj => {
if(Array.isArray(obj)) return obj.forEach(update);
if(typeof obj !== 'object') return;
Object.values(obj).forEach(update);
Object.assign(obj, map[obj.mapping]);
};
update(obj);
console.log(obj);