json数据怎么根据ID找索引值
[
{
id: 1,
childNode: [
{
id: 2,
name: '哈哈哈’
}
]
},
{
id: 3,
childNode: [
{
id: 4,
name: '哈哈哈’
}
]
}
]
如果传入一个id = 2,那么返回他的父级索引值,加上他自己的索引
如果传入一个id = 1,那么返回他自己的索引,他子节点索引为空
怎么写个递归呢
function indexesOf(data, id) { for(let i = 0;i<data.length;i++) { const item = data[i]; if(item.id == id) return [i]; if(item.childNode) { const childIndexes = indexesOf(item.childNode, id); if(childIndexes) return [i].concat(childIndexes); } } }
vue中的使用
// 当前选中的节点的index,如果当前点击节点的id是容器的子节点,那么就返回父级节点的索引,加上容器的子节点索引 activeElementIndex (state) { // 根据ID找索引值 function indexesOf (data, id) { for (let i = 0; i < data.length; i++) { const item = data[i] if (item.uuid === id) return [i] if (item.childNode && item.childNode.length > 0) { const childIndexes = indexesOf(item.childNode, id) if (childIndexes) return [i].concat(childIndexes) } } } return indexesOf(state.projectData.elements, state.activeElementUUID) }, // 根据子节点的id获取父节点的信息 getParentInfo: (state) => (id) => { // 根据ID找父节点的id function findParentId (data, id) { let result if (!data) return for (let i = 0; i < data.length; i++) { const item = data[i] if (item.uuid === id) { result = item // 找到id相等的则返回父节点 return result } else if (item.childNode && item.childNode.length > 0) { // 如果有子集,则把子集作为参数重新执行本方法 result = findParentId(item.childNode, id) if (result) { return data[i] } } } } return findParentId(state.projectData.elements, id) }