2017-04-25 40 views
0

我想通过名为“data”的嵌套varlist进行递归,并将其存储在QML中作为var。它包含一个名为"delegates": [ { ... }, ... , { ... } ]的属性,它为一些代表声明了一些属性。如果其中一个属性子列表包含一个属性“"data"我有另一个可以通过该特定代表的动作遍历的子级别QML/Javascript:向子数组添加自引用属性内嵌嵌套var匹配某些标识符

我想要做的是创建一个函数来递归追加到我的varlist如果data.delegates[0].data存在,我想追加相当于data.delegates[0].data.parentPointer: data;如果data.delegates[0].data.delegates[0].data存在,我想追加一个与子级名称匹配的子级别的指针("data")相当于data.delegates[0].data.delegates[0].data.parentPointer: data.delegates[0].data等等......

我并不特别关心(计算)成本,因为这是一个t 的Component.onCompleted中的ime事件,并且嵌套最多只有几层。

这是一个Javascript问题,我相信,因为我相信自动创建自引用指针的方式是通过某种递归调用function(这是通过定义在JavaScript中用于QML)。我知道该怎么做追加简单var套在Javascript操作在QML:

function appendStuff(myVar) { 
    var temp = myVar 
    temp.push("stuff") 
    myVar = temp 
} 

,我知道我可以在Javascript中有条件地检查指定的属性瓦特/在var,如:

if (typeof currentLevel.data !== "undefined") { 
    //do stuff.... 
} 

然而,我在递归方面挂了 - 如何重建一个多级数组 - 同时正确地跟踪我在原始数组中的位置,直到我的编辑版本完成。我也意识到,当涉及到"parentPointer"时,我可能会需要我的编辑版本来引用它自己,这有点棘手。

任何想法?

+0

你能包括输入数据和期望的输出数据吗? – naomik

回答

1

要将新字段分配给JS对象,您可以使用myjsobject['newprop'] = value

因此,一个简单的递归函数来创建例如一个双向链表,将是这样的:

import QtQuick 2.0 
import QtQuick.Controls 1.4 

ApplicationWindow { 
    id: root 
    visible: true 
    width: 400; height: 450 

    function foo(depth, ref) { 
     var a = { value: depth } 
     if (depth !== 0) { 
      a['next'] = foo(depth - 1, a) 
     } 
     if (ref) a['pred'] = ref 
     return a 
    } 

    property var test: foo(10) 

    Component.onCompleted: console.log(test.value, test.next.value, test.next.pred.value) 
}