【问题标题】:accessing the parent object from the child object property in javascript从javascript中的子对象属性访问父对象
【发布时间】:2014-09-03 22:32:28
【问题描述】:

我的问题。我有一个这样的对象:

t.mainobject = {
    prop1: "",
    prop2: "",
    id: "1",
    prop3: [
        child1: {
            id: "111"
        },
        child2: {
            id: "112"
        }
    ]
};

只有 child1/child2 对我可见,而我不知道它的父对象。我尝试使用下划线,但没有找到任何可以为我提供父对象的方法。

提前感谢您的任何建议/建议。

编辑1:
我所有的子对象都是从多个对象创建的,所以它最终成为一个扁平对象。

喜欢:

t.mainobject = {
    prop1: "",
    prop2: "",
    id: "1",
    prop3: [
        child1: {
            id: "111"
        },
        child2: {
            id: "112"
        }
    ]
};


t.mainobject1 = {
    prop1: "",
    prop2: "",
    id: "2",
    prop3: [
        child1: {
            id: "211"
        },
        child2: {
            id: "212"
        }
    ]
};

t.mainobject3 = {
    prop1: "",
    prop2: "",
    id: "1",
    prop3: [
        child1: {
            id: "311"
        },
        child2: {
            id: "312"
        }
    ]
};

现在我得到了一个数组:

[{id:"111"},{id:"112"}, {id:"211"},{id:"212"}, {id:"311"},{id:"312"}]

现在我怎样才能使用 id 获取包含子对象的父对象。

编辑 2:

我的解决方案:

var parent = _.filter(allParent, function(r){
            for(var i=0; i<r.posts.length; i++){
                if(r.posts[i].id === allChildPosts[index].id){
                    return r.id;
                }
            }
        });

它将父对象返回给我,现在我可以轻松访问任何属性。

【问题讨论】:

  • "only child1/child2 is visible to me"是什么意思? JavaScript 中没有“父对象”这样的概念。对象与其属性之间的关系是单向的,除非您明确设置反向关系。
  • 这和underscore.js标签无关吧?
  • @FelixKling 希望我的编辑摘要能帮助顺便说一句,没有“父对象”的概念是什么意思,这是一个与 javascript 或任何语言无关的通用术语。
  • @LcSalazar 更正与 underscore.js 无关。我想看看我是否可以利用该库来获得我正在寻找的东西,因为它有很多实用方法。
  • 对,但是如果有这样的概念,JS可能已经支持获取“父对象”。因为它不是,所以您无法知道给定对象是否是另一个对象的属性值。您唯一能做的就是a)在创建对象时“手动”建立连接(就像我提到的那样)或b)迭代所有潜在“父对象”的属性并将属性值与给定的“子”对象进行比较(如果需要,递归)。

标签: javascript arrays object


【解决方案1】:

这不是直接可能的,因为据 JavaScript 所知,child1 可以是任意数量的对象的属性:因此,“父对象”的概念一般来说并没有真正的意义。

而且,如果没有对父对象的引用,它们将被垃圾回收,所以没有希望回到它们。

但是,如果您可以拥有一个对象的所有潜在父项的列表,则可以搜索所有对象:

function findParent(child){
  for(var i=0; i < parents.length; i++){
    var mainobject = parents[i]; // a potential parent
    for(childName in mainobject.prop3){
      if(mainobject.prop3[childName].id === child.id){ // match found!
        return mainobject;
      }
    }
  }
}

【讨论】:

  • 谢谢!我最终这样做了var parent = _.filter(allParent, function(r){ for(var i=0; i&lt;r.posts.length; i++){ if(r.posts[i].id === allChildPosts[index].id){ return r.id; } } });,所以我得到了 Parent 对象并轻松访问我正在寻找的任何键
猜你喜欢
  • 2020-10-10
  • 1970-01-01
  • 2015-06-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-07-12
  • 2019-10-06
相关资源
最近更新 更多