我需要你的帮助。所以这次的目标是我想递归地检查我的树结构。
一方面我有一个所谓的treeNode(例如:'Article.Artnr'),另一方面有一个所谓的contextEntry(它有一个'Article')。我需要检查 treeNode 中的名称是否存在于 contextEntry 中,如果存在我需要检查它的类型然后继续。现在棘手的部分:namesSplit 中的下一个名称是“Artnr”,我需要检查它是否是 contextEntry 中“Article”的属性。再次,如果是我需要检查它的类型并继续。我事先不知道我的结构会有多深,所以我真的很感谢你在这方面的帮助。
let namesSplit = treeNode.name.split('.');
let key = namesSplit[0];
let contextEntry = exprData.contextEntry.find(_x => _x.name === key);
我已经像这样实现了我的递归检查:
function recursive(names, contextEntry) {
for (let i = 0; i < names.length; i++) {
if (names[i] === contextEntry.name) {
// getType(contextEntry.value);
console.log('Name found in Context: ' + names[i]);
continue;
}
if (names[i] == Object.keys(contextEntry.value)) {
console.log(getType(contextEntry.value));
console.log('Child Name found in Context: ' + names[i]);
// console.log(Object.values(contextEntry.value));
}
}
}
recursive(namesSplit, contextEntry);
我还必须检查上下文中每个值的类型。有 4 种可能的数据类型:Primitive、Array of Primitive、 Object、Array of Objects
如果上下文中的值是基元或基元数组,它将引发错误,如果它是一个对象,我只需要提取它的值,如果它是一个对象数组,我需要找到正确的对象和而不是从中提取价值
VariableType 是一个枚举。我的检查功能是这样实现的:
function getType(contextEntry.value) {
if (Array.isArray(contextEntry.value)) {
for (let i of contextEntry.value) {
if (isPrimitive(i)) {
return VariableType.ARRAY_OF_PRIMITIVES;
}
}
if (contextEntry.value.some(val => typeof val === 'object')) {
return VariableType.ARRAY_OF_OBJECTS;
}
}
if (typeof contextEntry.value === 'object' && contextEntry.value !== null) {
return VariableType.OBJECT;
}
if (isPrimitive(contextEntry.value)) {
return VariableType.PRIMITIVE;
}
}