javascript - 向前或向后行走多维javascript数组

标签 javascript knockout.js

有一个像这样的可观察数组:

            this.list = ko.observableArray([
            new GoalItem(1, 'page', 'Getting started', 0, '', [
                new GoalItem(2, 'page', 'Getting started 1.1', 0, ''),
                new GoalItem(3, 'video', 'Video', 0, '', [
                    new GoalItem(4, 'data', 'Data', 0, ''),
                    new GoalItem(5, 'test', 'Test', 0, '', [
                        new GoalItem(6, 'page', 'Test prep', 0, '', [
                            new GoalItem(7, 'video', 'Test video', 0, ''),
                            new GoalItem(8, 'file', 'Test file', 0, '')
                        ])
                    ]),
                    new GoalItem(9, 'page', 'Sample page', 0, '')
                ])
            ]),
            new GoalItem(10, 'page', 'More data tracking', 0, '', [
                new GoalItem(11, 'data', 'Data 1', 0, ''),
                new GoalItem(12, 'data', 'Data 2', 0, '')
            ])
        ]);

假设当前事件项目是

new GoalItem(4, 'data', 'Data', 0, '')

我怎样才能/会“走路”

this.list

获取应该是的“下一个”项目

new GoalItem(5, 'test', 'Test', 0, '', [
                        new GoalItem(6, 'page', 'Test prep', 0, '', [
                            new GoalItem(7, 'video', 'Test video', 0, ''),
                            new GoalItem(8, 'file', 'Test file', 0, '')
                        ])
                    ]),

或者获取应该是的“上一个”项目

new GoalItem(3, 'video', 'Video', 0, '', [
                    new GoalItem(4, 'data', 'Data', 0, ''),
                    new GoalItem(5, 'test', 'Test', 0, '', [
                        new GoalItem(6, 'page', 'Test prep', 0, '', [
                            new GoalItem(7, 'video', 'Test video', 0, ''),
                            new GoalItem(8, 'file', 'Test file', 0, '')
                        ])
                    ]),
                    new GoalItem(9, 'page', 'Sample page', 0, '')
                ])

最好有类似的功能

this.list.next()

this.list.previous()

希望这是有道理的。

谢谢!

最佳答案

有多种方法可以解决这个问题。

我认为处理它的一个简单方法是创建一个计算可观察量来表示结构的扁平版本。这样,当您的各种数组发生变化时,它总是正确的。

这是一个将子项递归添加到计算可观察量的方法示例

//to be called recursively
var addChildren = function(array, result) {
    array = ko.utils.unwrapObservable(array);
    if (array) {
        for (var i = 0, j = array.length; i < j; i++) {
            result.push(array[i]);
            addChildren(array[i].children, result);
        }        
    }
};

//a flattened versions of the items
this.flatItems = ko.computed(function() {
    var result = [];
    addChildren(self.items(), result);
    return result;
});

下面是一个示例,显示通过 flatItems 移动下一个/上一个:http://jsfiddle.net/rniemeyer/VHEYK/

您也可以即时执行此操作,只需执行更多循环来查找每个项目的位置或附加元数据,以便您现在如何从项目返回到父级。

关于javascript - 向前或向后行走多维javascript数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9558957/

相关文章:

javascript - Fullcalendar 4.3 为后台事件添加标题

javascript - Wicket 6 JavaScript 引用不在 head 中

javascript - 如何获取点击区域的id而不是父id?

javascript - 删除成功后从表中删除行吗?

javascript - 如何使用 ko.validation.group 函数

javascript - 更改src时在statechange上传递youtube iframe api事件

javascript - 打开一个新的浏览器窗口/iframe 并在 TEXTAREA 中从 HTML 创建新文档?

knockout.js - 混合 knockout 和服务器端渲染

javascript - 对复杂的类结构和 knockout 感到困惑

knockout.js - 访问嵌套 'foreach' 中的外循环属性