javascript - 基于 ids 数组有效循环对象

标签 javascript arrays object

我正在将移动导航中的用户导航“状态”作为数组获取。例如:

['3124', '5312', '5232']

我需要使用该状态来获取 ID 为“5232”的对象,位于该对象的下 3 层。

数组长度可以不同,这意味着它可以返回 1 到 5 个 id,因此我不必总是一直向下循环。

这就是导航数据的样子,使用与上面示例中使用的相同的 ID,我希望我的函数返回 ID 为“evening”的对象 '5232':

[
    { 
        id: "3124", 
        name: "women", 
        children: [
            {
                id: "5312",
                name: "dresses",
                children: [
                    {
                        id: "8399",
                        name: "wedding",
                        children: []
                    },
                    {
                        id: "5232",
                        name: "evening",
                        children: []
                    }
                ]
            },
            {
                id: "3291",
                name: "shoes",
                children: []
            }
        ] 
    },
    { 
        id: "9482", 
        name: "men", 
        children: [
            {
                id: "8292",
                name: "jackets",
                children: []
            },
            {
                id: "3829",
                name: "hats",
                children: []
            }
        ] 
    }
]

我一直在与几位同事讨论这个问题,但我们确实找不到有效地完成此操作的好方法。我们无法更改数据,但我们可以更改用户状态的保存方式(如果这是错误的)。

我真的可以使用一些意见和想法来如何以良好的方式解决这个问题。

最佳答案

在树中按路径查找节点的简单函数

function findNodeByPath(nodes, path) {
  let node;
  
  if (!path) return;

  for (let id of path) {
    if (!nodes) break;

    for (let child of nodes) {
      if (child.id === id) {
        node = child;
        nodes = node.children;
        break;
      }
    }  
  }

  return node;
}

let nodes = [
    { 
        id: "3124", 
        name: "women", 
        children: [
            {
                id: "5312",
                name: "dresses",
                children: [
                    {
                        id: "8399",
                        name: "wedding",
                        children: []
                    },
                    {
                        id: "5232",
                        name: "evening",
                        children: []
                    }
                ]
            },
            {
                id: "3291",
                name: "shoes",
                children: []
            }
        ] 
    },
    { 
        id: "9482", 
        name: "men", 
        children: [
            {
                id: "8292",
                name: "jackets",
                children: []
            },
            {
                id: "3829",
                name: "hats",
                children: []
            }
        ] 
    }
];

console.log(findNodeByPath(nodes, ['3124', '5312', '5232']));

关于javascript - 基于 ids 数组有效循环对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48210156/

相关文章:

php - 搜索数组并删除不包含 A-Z 或带破折号的 A-Z 的条目

c# - 返回新对象的 C# 属性 getter 是最佳实践吗?

javascript - 使用 push() 将对象添加到对象中

javascript - Google Analytics 和 anonymizeIp

javascript - 保持CSS网格布局简单

javascript - Ajax 调用的返回值

arrays - 在Fortran中访问字符串中特定索引处的字符

java - 如何根据特定键的值 null 删除 JSON 数组中的 JSON 对象?

单个变量中的 JavaScript 数组和对象?

javascript - 在不重新加载页面的情况下在 url 中 append 参数