/**
* 根据树中某一节点的任一属性值,找到对应节点,仅找第一个匹配的节点
* @param {*} tree 需要查找的树
* @param {*} treeChildrenName 树的子节点列表名
* @param {*} sourceAttributeName 用于查找的属性名
* @param {*} sourceAttributeValue 用于查找的属性值
* @param {*} targetAttribute 目标节点,初始传入 {}
* @returns 查找到的节点
*/
var findTreeNodeByAnyNodeValue = function(tree, treeChildrenName, sourceAttributeName, sourceAttributeValue, targetAttribute) {
if (Array.isArray(tree) && tree.length > 0) {
tree.some(node => {
if (node[sourceAttributeName] === sourceAttributeValue) {
targetAttribute = objDeepCopy(node)
return true;
} else if (node[treeChildrenName] !== undefined) {
let temp = findTreeNodeByAnyNodeValue(node[treeChildrenName], treeChildrenName, sourceAttributeName, sourceAttributeValue, targetAttribute)
if (Object.keys(temp).length > 0) {
targetAttribute = objDeepCopy(temp)
return true
}
}
})
}
return targetAttribute
}
有引用的拷贝方法
/**
* 深度拷贝方法
* @param {} source 源对象
* @returns 复制的对象
*/
var objDeepCopy = function (source) {
var that = this;
var sourceCopy = source instanceof Array ? [] : {};
for (var item in source) {
sourceCopy[item] =
typeof source[item] === "object"
? that.objDeepCopy(source[item])
: source[item];
}
return sourceCopy;
};
示例
let tree = [
{
"classId": "C_2",
"nodeId": "C_2",
"children": [
{
"classId": "C_2",
"nodeId": "P_55"
}
]
},
{
"classId": "C_a9102ea251c446738a2cab1ac331237b",
"nodeId": "C_a9102ea251c446738a2cab1ac331237b",
"children": [
{
"classId": "C_a9102ea251c446738a2cab1ac331237b",
"nodeId": "P_7e9f5b13b94d4b18986ce9622330641c"
}
]
}
]
let targetAttribute = {}
let result = findTreeNodeByAnyNodeValue(tree, 'children', 'nodeId', 'P_55', targetAttribute);