gpt4 book ai didi

javascript - 操作递归数组

转载 作者:塔克拉玛干 更新时间:2023-11-02 22:50:51 28 4
gpt4 key购买 nike

我有这样的分层数据结构:

var tree = [ {foo: 1, children:[
{foo: 2, children:[
{foo: 13, children:[]},
{foo: 14, children:[]}
]},
{foo: 3, children:[]},
{foo: 4, children:[]}
]},

{foo: 5, children:[
{foo: 6, children:[]},
{foo: 8, children:[]}
]},

{foo: 9, children:[
{foo: 10, children:[]},
{foo: 11, children:[]},
{foo: 12, children:[]}
]} ];

树可以是任意深度。

为了重新定位树中的特定对象(包括它的子对象),我可以简单地写:

// Move object from [0, 0, 1] to [2, 1]
var obj = tree[0]['children'][0]['children'][1];
tree[0]['children'][0]['children'].splice(1, 1);
tree[2]['children'].splice(1, 0, obj);

但我无法对一般情况进行编程:

给定两组坐标,将对象从 [i1, i2, ..., im] 重新定位到 [j1, j2, ..., jn]。

我想要一些关于如何构造这个递归算法的提示。虽然这是一个纯 Javascript 问题,但我应该注意到我的应用程序使用了 AngularJS 和 jQuery。也许这些库提供了我可以使用的数组操作函数?

最佳答案

进行这种树遍历的一种方法是使用一个变量来存储对您导航到的树部分的引用,一次导航一个层。我们可以写一个遍历函数如下:

var traverseTree = function(tree, coord) {

var current = tree;

// Loop through the coordinates moving one at a time, no error handling
// what happens if the node doesn't exist?
for(var i = 0; i < coord.length; ++i) {
current = current[coord[i]].children;
}

// Return the node
return current;
}

然后我们可以将功能描述为两个函数,一个提取节点的方法和一个插入节点的方法:

var extractNodeFromTree = function(tree, coord) {

// We don't want to traverse the whole way
var last = coord.pop();

// Traverse to the parent
var parent = traverseTree(tree, coord);

// Extract the element using the last coordinate
return parent.splice(last, 1)[0];
}

var insertNodeIntoTree = function(tree, coord, node) {

// Same as last method
var last = coord.pop();
var parent = traverseTree(tree, coord);

// Insert node to the specified position
current.splice(last, 0, node);

}

您可以使用以下功能:

var node = extractNodeFromTree(tree, [0, 0, 1]);
insertNodeIntoTree(tree, [2, 1], node);

A fiddle to show it in action

关于javascript - 操作递归数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14120370/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com