JS树的查找 根据树中某一节点的任一属性值,找到对应节点

/**
 * 根据树中某一节点的任一属性值,找到对应节点,仅找第一个匹配的节点
 * @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);
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值