Javascript从子ID中获取父ID

时间:2017-01-19 07:03:33

标签: javascript

我有一些代码会返回我点击的subcat的名称。

以下是以下数据:

theData =    {
    "categories": [
        {
            "id": "661",
            "name": "some name",
            "description": "some description",
            "subcat": [
                {
                    "id": "662",
                    "name": "sub 1",
                    "translations": null
                },
                {
                    "id": "663",
                    "name": "sub 2",
                    "translations": null
                }
            ],
            "image": null
        },
        {
            "id": "657",
            "name": "some other name",
            "description": "",
            "subcat": [
                {
                    "id": "456",
                    "name": "sub 12",
                    "translations": null
                },
                {
                    "id": "656",
                    "name": "sub 15",
                    "translations": null
                }
            ],
            "image": null
        }
    ]
};

我需要一些方法来查找subcat名称的父ID。

例如,如果我给它“sub 15”,它将返回“661”,这是父id

我该怎么做?

5 个答案:

答案 0 :(得分:2)

默认情况下,没有办法访问"父母" Javascript中的一个对象 - 它可以在任何数量的其他对象中引用,甚至可以在其自身中引用,因此无法确定对象的唯一父对象是什么。

相反,我们只是遍历所有数据,直到找到匹配的ID,如果我们找不到它,则返回null。此解决方案依赖于您的ID是唯一的实体,因此如果不是这种情况,则必须更改它。话虽如此,这是一个例子:

function getParent(subID) {
    for (var i in theData.categories) {
        var parent = theData.categories[i];
        if ('subcat' in parent && 'length' in parent.subcat) {
            for (var j = 0; j < parent.subcat.length; j++) {
                if (parent.subcat[j].id === subID) {
                    return parent.id;
                }
            }
        }
    }

    return null;
}

如果您不希望函数返回null,则可以随时更改它以使其返回-1,假设-1为您的ID带外。另请注意,这不是最佳解决方案,因此,如果您打算将其用于大量数据,那么您将需要研究更快速和/或更高效的搜索算法。

答案 1 :(得分:1)

试试这个。我们必须遍历所有数据

[fiddle][1]

Fiddle

var input = "sub 15";
var id =-1;
for(var i=0;i<theData.categories.length;i++){
 if(theData.categories[i].subcat!=null){
   for(var j=0;j<theData.categories[i].subcat.length;j++){

     if(theData.categories[i].subcat[j].name==input){
     id= theData.categories[i].id;
     break;
   }
  }
 }
}
console.log(id)

答案 2 :(得分:0)

您可能会考虑更多通用解决方案,它会搜索subcat数组中的给定键和值。然后只取第一个对象的id

function getParentId(key, value) {
    return (theData.categories.filter(function (a) {
        return a.subcat.some(function (b) {
            return b[key] === value;
        });
    })[0] || {}).id;
}

var theData = { categories: [{ id: 661, name: "some name", description: "some description", subcat: [{ id: 662, name: "sub 1", translations: null }, { id: 663, name: "sub 2", translations: null }], image: null }, { id: 657, name: "some other name", description: 0, subcat: [{ id: 456, name: "sub 12", translations: null }, { id: 656, name: "sub 15", translations: null }], image: null }] };

console.log(getParentId('name', 'sub 15'));

答案 3 :(得分:0)

这可能不是最好的方法,但希望这会有用

var getSubCat = []; // create an empty array to map parent id with sub name
var getCat = theData.categories; // get categories 
getCat.forEach(function(item) { // loop through categories
  item.subcat.forEach(function(elem) {
    getSubCat.push({
      id: item.id,  // this is parent id
      sub: elem.name // name inside each subcat object. Total 4 subcat object
    });
})
})
var parentId = getSubCat.filter(function(elem){ // filter the getSubCat array
    return elem.sub ==='sub 15' 
})[0].id    // parentId is an array, we need first object so [0]
alert(parentId)

现在我在每个subcat对象中推送名称。根据要求,您也可以推送他们的身份

DEMO

答案 4 :(得分:0)

以下解决方案与furkle的解决方案类似。但是在这里它使用jquery来遍历json对象。

function getParent(subID) {
    var parentId = null;
    $.each(theData.categories, function(i, v)
    {
        $.each(v.subcat, function(idx, obj){
            if(obj.name ==subID)
                parentId = v.id
        })
    })
    return parentId;
}