使用JavaScript对象构建菜单的最有效方法

阿克塞尔·亨特(Axel Hunter)

我有以下JavaScript数组。有人知道不使用一堆循环就可以形成多维导航菜单的有效方法吗?我知道该对象可能更有效,但这是我如何从API接收数据的一个示例。

数组示例:

var arr = [
  {
    name: "Mens > Jumpers > Cotton",
    id: 11
  },
  {
    name: "Mens > Jumpers",
    id: 12
  },
  {
    name: "Mens",
    id: 13
  },
  {
    name: "Womens",
    id: 14
  },
  {
    name: "Womens > Shoes",
    id: 15
  }
];

所需的输出:

<ul>
  <li data-attr="13">Mens
    <ul>
      <li data-attr="12">Jumpers
        <ul>
          <li data-attr="11">Cotton</li>
        </ul>
      </li>
    </ul>
  </li>
  <li data-attr="14">Womens
    <ul>
      <li data-attr="15">Shoes</li>
    </ul>
  </li>
</ul>
帕特里克·罗伯茨

这是我Handlebars根据您的要求使用的解决方案

Handlebars.registerPartial('nested',
`<ul>
{{#each children}}
<li data-attr="{{id}}">{{name}}
{{#if children}}
{{> nested}}
{{/if}}
</li>
{{/each}}
</ul>`);

要将arr对象准备为部分的上下文,请执行以下操作:

arr = arr.map(function(li) {
  return {
    name: li.name.split(/\s*>\s*/g),
    id: li.id
  };
}).sort(function(a, b) {
  return a.name.length - b.name.length || a.id - b.id;
});

arr = arr.map(function(parent) {
  var parentName = parent.name.join(' > ');

  parent.children = arr.filter(function(child) {
    return (
      child.name.slice(0, parent.name.length).join(' > ') === parentName &&
      child.name.length - parent.name.length === 1
    );
  });

  return parent;
}).filter(function(li) {
  var depth = li.name.length - 1;

  li.name = li.name[depth];

  return depth === 0;
});

上面的排序可能是不必要的,但为了安全起见,我这样做是为了确保父母优先,孩子优先。以下是完整的演示:

// initial data

var arr = [
  {
    name: "Mens > Jumpers > Cotton",
    id: 11
  },
  {
    name: "Mens > Jumpers",
    id: 12
  },
  {
    name: "Mens",
    id: 13
  },
  {
    name: "Womens",
    id: 14
  },
  {
    name: "Womens > Shoes",
    id: 15
  }
];

// Handlebars partial

Handlebars.registerPartial('nested',
`<ul>
{{#each children}}
<li data-attr="{{id}}">{{name}}
{{#if children}}
{{> nested}}
{{/if}}
</li>
{{/each}}
</ul>`);

// format data to context of partial

arr = arr.map(function(li) {
  return {
    name: li.name.split(/\s*>\s*/g),
    id: li.id
  };
}).sort(function(a, b) {
  return a.name.length - b.name.length || a.id - b.id;
});

arr = arr.map(function(parent) {
  var parentName = parent.name.join(' > ');

  parent.children = arr.filter(function(child) {
    return (
      child.name.slice(0, parent.name.length).join(' > ') === parentName &&
      child.name.length - parent.name.length === 1
    );
  });
  
  return parent;
}).filter(function(li) {
  var depth = li.name.length - 1;

  li.name = li.name[depth];

  return depth === 0;
});

// render the HTML

var main = Handlebars.compile('{{> nested}}');
document.body.innerHTML = main({children: arr});
body > ul {
  padding: 0;
}

ul, li {
  display: block;
  padding-left: 1em;
}

ul:before {
  content: "<ul>";
}

ul:after {
  content: "</ul>";
}

li:before {
  content: "<li data-attr=\"" attr(data-attr) "\">";
}

li:after {
  content: "</li>";
}
<script src="https://cdnjs.cloudflare.com/ajax/libs/handlebars.js/2.0.0-alpha.1/handlebars.min.js"></script>

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

使用这种逻辑构建 VueJS 应用程序的最有效方法是什么?

来自分类Dev

在JavaScript中合并多个排序对象数组的最有效方法是什么?

来自分类Dev

JavaScript在数组中查找对象的最有效方法

来自分类Dev

从迭代ArrayList内部删除对象的最有效方法

来自分类Dev

引用嵌套对象的最有效方法

来自分类Dev

什么是在Django中过滤对象的最有效方法

来自分类Dev

从迭代ArrayList内部删除对象的最有效方法

来自分类Dev

引用嵌套对象的最有效方法

来自分类Dev

将对象用作哈希键的最有效方法

来自分类Dev

搜索对象值数组的最有效方法

来自分类Dev

将Cassandra BoundStatement的ResultSet映射/转换/广播到使用对象映射API构建的Java类的最有效方法是什么?

来自分类Dev

使用 Lodash 或 vanilla JS 根据对象键过滤数组的最有效方法是什么?

来自分类Dev

在JavaScript中搜索数组映射的最有效方法

来自分类Dev

确保Javascript中顺序命令的最有效方法

来自分类Dev

在JavaScript中搜索数组映射的最有效方法

来自分类Dev

使用JavaScript评估字符串是否是回文符的最有效方法是什么?

来自分类Dev

使用JavaScript和Regex从文件中获取XML标记的最有效方法

来自分类Dev

使用bash删除旧文件的最有效方法

来自分类Dev

使用和与多个线程通信的最有效方法

来自分类Dev

使用AJAX最有效的搜索方法?

来自分类Dev

使用toString()JAVA的最有效方法

来自分类Dev

使用 EF 获得单个值的最有效方法?

来自分类Dev

在javascript中获取数字的最低有效位的最有效方法是什么?

来自分类Dev

将这个 JavaScript 对象转换为更有用的结构的最有效方法是什么?

来自分类Dev

在javascript中2个对象之间返回匹配元素数组的最有效方法是什么?

来自分类Dev

用JavaScript在列表中查找对象的首次出现索引的最快/最有效方法是什么?

来自分类Dev

从数组删除的最有效方法?

来自分类Dev

最有效的句子拆分方法

来自分类Dev

循环浏览“ ...”的最有效方法

Related 相关文章

  1. 1

    使用这种逻辑构建 VueJS 应用程序的最有效方法是什么?

  2. 2

    在JavaScript中合并多个排序对象数组的最有效方法是什么?

  3. 3

    JavaScript在数组中查找对象的最有效方法

  4. 4

    从迭代ArrayList内部删除对象的最有效方法

  5. 5

    引用嵌套对象的最有效方法

  6. 6

    什么是在Django中过滤对象的最有效方法

  7. 7

    从迭代ArrayList内部删除对象的最有效方法

  8. 8

    引用嵌套对象的最有效方法

  9. 9

    将对象用作哈希键的最有效方法

  10. 10

    搜索对象值数组的最有效方法

  11. 11

    将Cassandra BoundStatement的ResultSet映射/转换/广播到使用对象映射API构建的Java类的最有效方法是什么?

  12. 12

    使用 Lodash 或 vanilla JS 根据对象键过滤数组的最有效方法是什么?

  13. 13

    在JavaScript中搜索数组映射的最有效方法

  14. 14

    确保Javascript中顺序命令的最有效方法

  15. 15

    在JavaScript中搜索数组映射的最有效方法

  16. 16

    使用JavaScript评估字符串是否是回文符的最有效方法是什么?

  17. 17

    使用JavaScript和Regex从文件中获取XML标记的最有效方法

  18. 18

    使用bash删除旧文件的最有效方法

  19. 19

    使用和与多个线程通信的最有效方法

  20. 20

    使用AJAX最有效的搜索方法?

  21. 21

    使用toString()JAVA的最有效方法

  22. 22

    使用 EF 获得单个值的最有效方法?

  23. 23

    在javascript中获取数字的最低有效位的最有效方法是什么?

  24. 24

    将这个 JavaScript 对象转换为更有用的结构的最有效方法是什么?

  25. 25

    在javascript中2个对象之间返回匹配元素数组的最有效方法是什么?

  26. 26

    用JavaScript在列表中查找对象的首次出现索引的最快/最有效方法是什么?

  27. 27

    从数组删除的最有效方法?

  28. 28

    最有效的句子拆分方法

  29. 29

    循环浏览“ ...”的最有效方法

热门标签

归档