无法在javascript的嵌套对象/数组中正确循环

Unable to loop through properly in nested object/array in javascript

本文关键字:数组 循环 对象 javascript 嵌套      更新时间:2023-09-26

我有一个对象(来自MongoDB),看起来像这样:

var test = [
  {
    "_id": "1",
    "childs": [
      {
        "name": "First child",
        "child_id": 1
      },
      {
        "name": "Second child",
        "child_id": 2
      }
    ]
  },
  {
    "_id": "2",
    "childs": [
      {
        "name": "First child",
        "child_id": 1
      }
    ]
  }
];

我试图通过这个循环,并显示每个子作为一个单独的项目。我是这样做的:

var response_items = [];
//Process relays as individual devices
test.forEach(function(device) {
    var response_item = {};
    response_item._id = device._id;
    //Process relays as individual devices
    device.childs.forEach(function(child) {
        response_item.name = child.name;
        response_item.child_id = child.child_id;
        //Return devices
        response_items.push(response_item);
    });
});
console.log(response_items);

但由于某些原因,这是我得到的结果:

Array (3)
{_id: "1", name: "Second child", child_id: 2}
{_id: "1", name: "Second child", child_id: 2}
{_id: "2", name: "First child", child_id: 1}

第三项是正确的,但是第一项和第二项是重复的,我不知道我做错了什么。

示例:https://jsfiddle.net/om89y661/

var test = [
  {
    "_id": "1",
    "childs": [
      {
        "name": "First child",
        "child_id": 1
      },
      {
        "name": "Second child",
        "child_id": 2
      }
    ]
  },
  {
    "_id": "2",
    "childs": [
      {
        "name": "First child",
        "child_id": 1
      }
    ]
  }
];
    
var response_items = [];
//Process relays as individual devices
test.forEach(function(device) {
//Process relays as individual devices
device.childs.forEach(function(child) {
                var response_item = {};
	response_item._id = device._id;
  
	response_item.name = child.name;
	response_item.child_id = child.child_id;
	//Return devices
	response_items.push(response_item);
});
});
console.log(response_items);

使用Array.reduce()以纯函数方式平化数组,如下所示:

var test = [
  {
    "_id": "1",
    "childs": [
      {
        "name": "First child",
        "child_id": 1
      },
      {
        "name": "Second child",
        "child_id": 2
      }
    ]
  },
  {
    "_id": "2",
    "childs": [
      {
        "name": "First child",
        "child_id": 1
      }
    ]
  }
];
var result = test.reduce(function (accumulator, current) {
  var mappedRes = current.childs.map(function (item) {
    item._id = current._id;
    return item;
  });
  return accumulator.concat(mappedRes);
}, []);
console.log(result);