Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/477.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 递归数据操作_Javascript - Fatal编程技术网

Javascript 递归数据操作

Javascript 递归数据操作,javascript,Javascript,假设我们正在接收此对象数组: [ { ownerId: 1, personName: John, petsOwned: [ { petId: 1, petName: Fluffy, petType: cat, diseases: [ {

假设我们正在接收此对象数组:

[
    {
        ownerId: 1,
        personName: John,
        petsOwned: [
            {
                petId: 1,
                petName: Fluffy,
                petType: cat,
                diseases: [
                    {
                        diseaseId: 1,
                        diseaseName: A,
                    },
                    {
                        diseaseId: 2,
                        diseaseName: B,
                    }
                ]
            },
            {
                petId: 2,
                petName: Biscuit,
                petType: dog,
                diseases: [
                    {
                        diseaseId: 3,
                        diseaseName: G,
                    },
                    {
                        diseaseId: 4,
                        diseaseName: Z,
                    }
                ]
            },
            {
                petId: 3,
                petName: Ant,
                petType: hamster,
                diseases: [
                    {
                        diseaseId: 5,
                        diseaseName: Vx,
                    },
                    {
                        diseaseId: 6,
                        diseaseName: T1,
                    },
                    {
                        diseaseId: 55,
                        diseaseName: YU,
                    }
                ]
            }
        ]
    }
]
这样级联4次甚至更多次,每个级联都没有关于其父对象的任何信息

我的意思是,从中取出
Fluffy
最终将没有所有者,因为它没有
ownerId

如果超过50名宠物主人拥有随机数量的宠物,并且这些宠物可能有随机数量的疾病或任何你喜欢的东西,你将如何返回宠物疾病的完整列表,有没有一种方法不使用JavaScript中的循环内循环等


感谢您抽出时间,我希望您能清楚地理解我的问题。

我认为您所拥有的基本上是可以的,只是您在“疾病”定义中可能存在冗余。如果一只宠物与另一只宠物有相同的疾病ID,但有不同的疾病名称,这意味着什么?如果要将JSON定义为一个对象而不是数组,那么可以包括一个“所有者”字段,其中包含“宠物”;以及该数据集中包含的所有疾病的小型数据库。然后,疾病阵列将不再在宠物体内有疾病结构,而只会有类疾病

如果疾病开始变得更复杂,并且结果中的几只宠物开始两次包含同一只宠物,这将特别有用。在节省转移尺寸的同时,也可以说减少了“活动部件”的数量


在其他情况下,我建议将主人、宠物和疾病分开存放,但每种类型都要求主人具有任何逻辑意义,否则我觉得没问题;区分疾病的一点是,几只宠物可能有相同的疾病,但几只主人不能养同一只宠物。

好吧。。您仍然需要遍历对象,因此必须使用循环,然后最简单的方法是首先使用JSON.parse将其转换为javascript对象

所以你可以做一些像

var john = JSON.parse(string);
然后,您可以从编写一个简单的函数开始,该函数获取来自某个宠物的每种疾病,并以数组形式返回它,例如

var getDiseaseId = function() {
     var ret = new Array();
     for(var i = 0; i < diseases.length; i++)
         ret.push(diseases[i].diseaseId);
     return ret;
 }
var getDiseaseId=function(){
var ret=新数组();
对于(变量i=0;i<0.length;i++)
ret.push(疾病[i].diseaseId);
返回ret;
}
当你完成这项工作后,你可以开始建造穿越所有宠物的建筑,获得它们的所有疾病,然后返回最后一个阵列

var allDiseases = new Array();
for(var i = 0; i < john.petsOwned.length; i++) {
      allDiseases.push.apply(allDiseases, getDiseaseId(john.petsOwned[i]));
 }
var allDiseases=new Array();
for(var i=0;i
构建一个递归函数——通过这种方式,您可以更改数据的结构方式,并且仍然使用相同的函数来构建数组

var doRecursion = function(items, targetKey, type) {
    type = type || "";
    var results = [];

    if (type == targetKey) {

        return items;

    } else if (typeof items == "object" && items != null) {

        for (var i in items) {
            var moreItems = doRecursion(items[i], targetKey, i);
            for (j in moreItems) {
                results.push(moreItems[j]);
            }
        }

    } 

    return results;
}

console.log(doRecursion(pets, "diseases"));

请参阅fiddle。

您的数据似乎不是任意递归的,它有一个清晰的层次结构:所有者->宠物->疾病,每个都有不同的属性名称。使用嵌套循环完全可以做到这一点。预期的结果是
所有者ID
疾病
,或者,只有所有
疾病
?如果数据是这样存储的,那么它总是会有某种循环。这种行为也不是JSON特有的——XML甚至SQL数据库也是如此。除非以不同的方式存储数据,否则您将不得不查询所有记录以获得结果。正如@dave所说,您需要以中间形式(dbms或内存中的映射)存储数据,以便高效地查询此数据。或者解析它并创建适合您查询的索引。因此我怀疑,如果我决定在宠物主人中创建一个大的宠物数组,除非我将ownerId添加到每个宠物中,否则我将无法找到哪个宠物属于谁?我的意思是,没有其他方法可以在不丢失父对象数据的情况下实现这一点