我有一个对象,称之为 Obj1,需要将 Obj1 中的值与另一个对象 obj2"键值"对进行比较,并返回键(如果存在)



考虑以下obj1和obj2

const obj1 = 
{
“array”:
[{"path": "time.day"},
{"path": “human.gender”},
{“nestedArray”: [{"path": "time.Month"},{"path": "time.Day"}]}
]
}
const obj2 =
{"time":{"day": "String”,"Month": “String”},“human”:{“gender”: “String”}}

现在我需要在obj1中循环数组和嵌套数组,并检查obj1数组的"路径"与obj2中的键值对匹配。如何做到这一点?

示例:

const obj1 = {
array: [{
path: "time.day"
},
{
path: "human.gender"
},
{
nestedArray: [{
path: "time.Month"
}, {
path: "time.Day"
},
{
nestedArray: [{
path: "human.foo"
}, ]
}
]
}
]
}
const obj2 = {
time: {
day: "String",
Month: "String"
},
human: {
gender: "String",
foo: "bar",
}
}
const data = [];
function recursion(e) {
if (e.path) {
const values = e.path.split('.');
const path = obj2[values[0]][values[1]]
if (path) {
data.push(values[0]);
data.push(values[1]);
}
} else if (e.nestedArray) {
e.nestedArray.forEach((element) => {
recursion(element)
});
}
}

obj1.array.forEach((e) => {
recursion(e)
});

console.log(data)

重要

只有当为数组添加值的条件时,此代码才有效。路径是正确的——不仅仅是它的一部分(路径由两部分组成)

您可以拆分字符串并在obj2中检查。

const obj1 = {
array: [
{ path: "time.day" },
{ path: "human.gender" },
{ nestedArray: [{ path: "time.Month" }, { path: "time.Day" }] },
],
};
const obj2 = {
time: { day: "String", Month: "String" },
human: { gender: "String" },
};
const find = (arr, obj2) => {
const result = [];
arr.forEach((a) => {
if (a?.path) {
const [start, end] = a?.path?.split(".") ?? [];
if (obj2[start]) {
result.push(start);
if (obj2[start][end]) result.push(end);
}
} else if (a?.nestedArray) {
result.push(...find(a.nestedArray, obj2));
}
});
return result;
};
console.log(find(obj1.array, obj2));