向前或向后遍历多维javascript数组

向前或向后遍历多维javascript数组,javascript,knockout.js,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, '', [

具有这样的可观察阵列:

            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, '')
我怎样才能“走路”

获取“下一个”项目,该项目应

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, '')
                ])
或者获取“上一个”项目,该项目应为

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()

希望这是有意义的


谢谢

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

我认为处理它的一个简单方法是创建一个表示结构的扁平版本的计算可观察对象。这样,随着各种阵列的变化,它始终是正确的

下面是一个递归地将子项添加到计算的可观察对象的方法示例

//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;
});
//递归调用
var addChildren=函数(数组、结果){
数组=ko.utils.unwrapobbservable(数组);
if(数组){
对于(var i=0,j=array.length;i
下面是一个示例,显示如何通过
flatItems
移动下一个/上一个:


您也可以在运行中执行此操作,只需执行更多的循环以查找每个项目的位置,或者附加元数据,这样您就可以了解如何从项目返回父项

您需要保留活动项的索引,并在需要下一个(递增索引)或上一个(递减索引)时使用它。另一个奇妙的答案!易于实施,工作无问题。非常感谢!这可能证明了它自己的问题,如果是这样的话,请提前道歉。我正在使用在UI中呈现this.list-一旦“删除”完成,那么显然上一个()下一个()不同步。有没有一种解决方案可以根据删除的元素的新布局触发可观察数组的重新排序?我没有具体介绍您正在使用的插件,但我编写了一个绑定,该绑定与jQuery UI可排序功能一起工作。项目位于此处:。绑定将确保ObservalArrays保持同步,并有一些回调来进一步定制行为。