在递归函数中保留对象引用
Keep object reference in recursive function
我有一个应用程序,其中一个对象用于显示用户系统上文件的树视图。它的结构如下:
[{
text: 'C:/',
type: 'dir',
nodes: [
{
text: 'foo',
type: 'dir',
nodes: [] // And so on
},
{
text: 'bar',
type: 'file'
}
}]
按照惯例,我希望首先显示目录,然后再显示文件。不幸的是,无论项目类型如何,我的数据都是按字母顺序检索的。
为了解决这个问题,我写了一个很好的递归函数
var sort = function (subtree)
{
subtree = _.sortBy(subtree, function (item)
{
if (item.nodes)
{
sort(item.nodes)
}
return item.type
});
}
var tree = someTreeData;
sort(tree);
我正在使用 lodash 按文件类型的字母顺序对每个 nodes
数组进行排序。不幸的是,子树似乎没有引用树对象,因为当我记录它的输出时它仍然未排序。我该如何补救?
您可以使用 JavaScript 的内置 Array.prototype.sort
函数,它会就地排序。它接受两个参数并进行比较。请注意,在 sortBy
键提取器中排序 item.notes
有点不合适。
function isDirectory(node) {
return !!node.nodes;
}
function sortTree(subtree) {
subtree.sort(function (a, b) {
return a.type < b.type ? -1 :
a.type > b.type ? 1 : 0;
});
subtree
.filter(isDirectory)
.forEach(function (node) {
sortTree(node.nodes);
});
}
我有一个应用程序,其中一个对象用于显示用户系统上文件的树视图。它的结构如下:
[{
text: 'C:/',
type: 'dir',
nodes: [
{
text: 'foo',
type: 'dir',
nodes: [] // And so on
},
{
text: 'bar',
type: 'file'
}
}]
按照惯例,我希望首先显示目录,然后再显示文件。不幸的是,无论项目类型如何,我的数据都是按字母顺序检索的。
为了解决这个问题,我写了一个很好的递归函数
var sort = function (subtree)
{
subtree = _.sortBy(subtree, function (item)
{
if (item.nodes)
{
sort(item.nodes)
}
return item.type
});
}
var tree = someTreeData;
sort(tree);
我正在使用 lodash 按文件类型的字母顺序对每个 nodes
数组进行排序。不幸的是,子树似乎没有引用树对象,因为当我记录它的输出时它仍然未排序。我该如何补救?
您可以使用 JavaScript 的内置 Array.prototype.sort
函数,它会就地排序。它接受两个参数并进行比较。请注意,在 sortBy
键提取器中排序 item.notes
有点不合适。
function isDirectory(node) {
return !!node.nodes;
}
function sortTree(subtree) {
subtree.sort(function (a, b) {
return a.type < b.type ? -1 :
a.type > b.type ? 1 : 0;
});
subtree
.filter(isDirectory)
.forEach(function (node) {
sortTree(node.nodes);
});
}