嵌套循环未形成完整对象 - 问题

Nested loops not forming the full object - issue

本文关键字:问题 对象 未形成 嵌套循环      更新时间:2023-09-26

我有一个如下所示的array of objects

[
  {
    "__v": 0,
    "_id": "5634fa3df925a0ac02f1b0fa",
    "groupname": "group 1",
    "subgroups": [
      {
        "__v": 0,
        "_id": "5634fa63f925a0ac02f1b0fc",
        "subgroupname": "subgroup 1",
        "books": [
          {                
            "bookname": {
              "name": "sasasasasasP"
            }
         }
        ]
    ]
  },
  {
    "__v": 0,
    "_id": "5634fa3df925a0ac02f1b0fd",
    "groupname": "group 2",
    "subgroups": [
      {
        "__v": 0,
        "_id": "5634fa63f925a0ac02f1befc",
        "subgroupname": "subgroup 2",
        "books": [
          {                
            "bookname": {
              "name": "book 2"
            }
         }
        ]
    ]
  }
]

我想从上面的对象下面形成一个这样的array of objects

[
    {
        "groupname": "Group 1",
        "subgroupname": "subgroup 1",
        "bookname": "Enersol"
    },
    {
        "groupname": "Group 2",
        "subgroupname": "subgroup 2",
        "bookname": "Enersol"
    }
]

下面是我尝试过的,但是在数组中形成第一个对象后循环失败。

var apiListData = [];
for (var i = 0, len = groups.length; i < len; i++) {
    for (var j = 0, len = groups[i].subgroups.length; j < len; j++) {
        for (var k = 0, len = groups[i].subgroups[j].books.length; k < len; k++) {
            apiListData.push({
                gname: groups[i].groupname,
                sname: groups.[i].subgroups[j].subgroupname,
                bookname: groups[i].subgroups[j].books[k].bookname
            })
        }
    }
}

请看一下 http://jsfiddle.net/es47k33o/

这里有多个错误:

  1. 您提供的 JSON 结构非常混乱,它固定在小提琴中
  2. 错别字:sname: groups.[i].subgroups[j].subgroupname中有一个点太多
  3. 要访问书名的字符串值,您必须获得比bookname: groups[i].subgroups[j].books[k].bookname更深的级别
  4. 你在这里的实际算法问题是你总是重新声明变量 len。我根据各自的索引重命名了第二个和第三个:

var apiListData = [];
for (var i = 0, len = groups.length; i < len; i++) {
	for (var j = 0, lenj = groups[i].subgroups.length; j < lenj; j++) {
		for (var k = 0, lenk = groups[i].subgroups[j].books.length; k < lenk; k++) {
			apiListData.push({
				gname: groups[i].groupname,
				sname: groups[i].subgroups[j].subgroupname,
				bookname: groups[i].subgroups[j].books[k].bookname.name
			})
		}
	}
}

请尝试此 JSFiddle 示例并查看浏览器控制台日志。

首先,您的JSON已损坏,每个组中缺少一个},这是一个有效的:

var groups = [{
    "__v": 0,
        "_id": "5634fa3df925a0ac02f1b0fa",
        "groupname": "group 1",
        "subgroups": [{
        "__v": 0,
            "_id": "5634fa63f925a0ac02f1b0fc",
            "subgroupname": "subgroup 1",
            "books": [{
            "bookname": {
                "name": "sasasasasasP"
            }
        }]
    }]
}, {
    "__v": 0,
        "_id": "5634fa3df925a0ac02f1b0fd",
        "groupname": "group 2",
        "subgroups": [{
        "__v": 0,
            "_id": "5634fa63f925a0ac02f1befc",
            "subgroupname": "subgroup 2",
            "books": [{
            "bookname": {
                "name": "book 2"
            }
        }]
    }]
}];

除了 Dochow @Stefan识别的代码中的其他问题之外,最好使用变量来标识这种具有嵌套循环的逻辑中的对象。 下面是一个示例:

var apiListData = [];

for (var i = 0, totalGroups = groups.length; i < totalGroups; i++) {
    var group = groups[i];
    var subGroups = group.subgroups;
    for (var j = 0, totalSubGroups = subGroups.length; j < totalSubGroups; j++) {
        var subGroup = subGroups[j];
        var books = subGroup.books;
        for (var k = 0, totalBooks = books.length; k < totalBooks; k++) {
            var book = books[k].bookname;
            apiListData.push({
                groupName: group.groupname,
                subGroupName: subGroup.subgroupname,
                bookName: book.name
            });
        }
    }
}

console.log('apiListData', apiListData);