【问题标题】:Search whole javascript object with children用孩子搜索整个 javascript 对象
【发布时间】:2016-04-09 02:17:53
【问题描述】:

我目前有这个对象:

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

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

现在,我想知道如何获得正确的项目对象。例如,如果我发送父“2”,它将从 1: 的子代中获得 2:。我能想到的唯一方法是for循环,但我不知道是否有更有效的方法。孩子可以延伸得更多,所以父母有孩子,那些孩子无穷无尽地有孩子。至少这就是整个想法。

我认为 for 循环对于一些项目是可以的,但我认为如果我有超过 50 个项目,它已经很慢,而且如果更多,它甚至会更慢。

【问题讨论】:

  • “如果我有超过 50 个项目,它已经很慢了”——嗯,取决于你对“慢”的定义,但是 50 次递归最多需要毫秒。无论如何...

标签: javascript object search


【解决方案1】:

此解决方案使用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);

【讨论】:

    【解决方案2】:

    如果您想快速添加,您可以在对象或映射 (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);
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-02-12
      • 2019-04-12
      • 1970-01-01
      • 1970-01-01
      • 2014-11-28
      • 2018-02-18
      相关资源
      最近更新 更多