搜索整个JavaScript对象及其子项

3

我目前有这个对象:

var obj = {
    1: {
    title: 'test',
    children: {
        2: {
        title: 'test2',
        children: {}
      },
      3: {
        title: 'test3',
        children: {}
      }
    }
  }
};

整个想法是我创建一个函数来向这个对象添加一个项目。作为参数,我发送父级。

现在,我想知道如何获取正确的项目对象。例如,如果我发送父级 '2',它将从1:的子项中获取2:。我能想到的唯一方法是使用for循环,但我不知道是否有更有效的方法。孩子们甚至可以进一步扩展,因此一个父类有孩子,那些孩子无休止地拥有孩子。这至少是整个想法。

我认为对于一些项目,使用for循环还可以,但是如果有超过50个项目,速度已经很慢了,而且随着数量的增加,速度会更慢。


“如果我有超过50个项目,它已经很慢了” - 好吧,这取决于您对“慢”的定义,但50次递归最多只需要几毫秒。无论如何... - JJJ
可能是在深度对象中按名称查找属性的重复问题。 - JJJ
2个回答

3
这个解决方案使用 Object.keys() 获取给定对象的所有键,然后使用短路 Array.prototype.some() 进行数组迭代以查找键。 如果找到,则返回引用,否则检查项目是否为对象。 如果是,则使用 getReference() 获取对象引用进行新的搜索。

var obj = { 1: { title: 'test', children: { 2: { title: 'test2', children: {} }, 3: { title: 'test3', children: {} } } } };

function getReference(o, p) {
    var r;
    Object.keys(o).some(function (k) {
        if (k === p) {
            r = o[k];
            return true;
        }
        if (typeof o[k] === 'object') {
            r = getReference(o[k], p);
            return !!r;
        }
    });
    return r;
}

var x = getReference(obj, '2');
document.write(x.title);


0
如果你想让添加更快,你可以在对象或映射(ES6)中保留子节点的索引。它可能看起来像这样:
function Tree() {
    this.data = {};
    this.indexes = {0: this.data};
}

Tree.prototype = {
    addNode: function(parentIndex, index, node) {
        // handle cases when parentIndex does not exist
        // handle cases when index already exists
        this.indexes[index] = node;
        var parent = this.indexes[parentIndex];
        parent.children = parent.children || {};
        parent.children[index] = node;            
    }
}

var tree = new Tree();

tree.addNode(0, 1, { title: 'test' });
tree.addNode(1, 2, { title: 'test2' });
tree.addNode(1, 3, { title: 'test3' });

console.log(tree.data);

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接