javascript - 使用 Knockout 'foreach' 循环遍历多维数组

标签 javascript arrays multidimensional-array knockout.js

我有一个多维关联数组。

this.items = ko.observableArray([
    { name: "name1", viewable: true, children: [
        { name: "name1-1", viewable: true, children: []},
        { name: "name1-2", viewable: false, children: []}
    ] },
    { name: "name2", viewable: false, children: [] },
    { name: "name3", viewable: true, children: [
        { name: "name3-1", viewable: true, children: []},
    ] },
        { name: "name4", viewable: true, children: [] }
]);

目标是遍历此数组并仅打印出将“viewable”设置为 true 的值。

我使用一堆 if 和 foreach 语句来完成这项工作,但代码开始失控。此示例仅涵盖 2 个级别,但我的数组最多可以达到 5 个级别的深度,因此此代码将成倍增加并变得丑陋非常快

<ul data-bind="foreach: items">
    <!-- ko if: viewable -->
    <li data-bind="text: name"></li>
        <!-- ko foreach: children -->
            <!-- ko if: viewable -->
            <li data-bind="text: name"></li>
            <!-- /ko -->
        <!-- /ko -->
    <!-- /ko -->
</ul>

那么有没有更简单/更好的方法来遍历整个数组?

JS Fiddle link

最佳答案

Underscore.js有一些处理数组的好方法也许你可以使用 flattenfilter从你的结构创建一个数组然后你可以只写一个 foreach:

或者您可以使用模板来封装您的 if: viewable 逻辑并递归地应用模板:

<script type="text/html" id="template">
  <!-- ko if: viewable -->
    <li data-bind="text: name"></li>    
        <!-- ko template: { name: 'template', foreach: $data.children } -->
        <!-- /ko -->    
  <!-- /ko -->
</script>

<ul data-bind="template: { name: 'template', foreach: items } ">
</ul>

演示 JSFiddle.

关于javascript - 使用 Knockout 'foreach' 循环遍历多维数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15814603/

相关文章:

JavaScript 数组到列表

java - 列排序数组?

c - 使用双指针参数访问函数内的数组成员的段错误

javascript - 如果外部应用程序更改了持久模型(服务器数据库),AngularJS 可以自动更新 View 吗?

javascript - 将控件绑定(bind)到多个输入的 Angular Reactive Forms 不会刷新其他输入

javascript - child UL 对父亲 LI 动画的奇怪行为

php - 运行单行 javascript 代码?

php - 如何将我的一串数字输入数组以获得最频繁出现的数字?

java - 如何确保写入整数数组的可见性

c - scanf() 不写入二维字符数组