【问题标题】:How to get objects from array nested in another object in array with ES6如何使用 ES6 从嵌套在数组中另一个对象中的数组中获取对象
【发布时间】:2019-06-16 05:13:03
【问题描述】:

我有以下结构的数据:

var DATA = {
'device_groups': [{
  'id': '1',
  'name': 'group 1',
  'devices': [{
    'id': 11,
    'name': 'device 11',
    'active': 1
  }, {
    'id': 12,
    'name': 'device 12',
    'active': 0
  }, {
    'id': 13,
    'name': 'device 13',
    'active': 0
  }] 
}, {
  'id': '2',
  'name': 'group 2',
  'devices': [{
    'id': 21,
    'name': 'device 21',
    'active': 1
  }, {
    'id': 22,
    'name': 'device 22',
    'active': 0
  }, {
    'id': 23,
    'name': 'device 23',
    'active': 1
  }]
}, {
  'id': '3',
  'name': 'group 3',
  'devices': [{
    'id': 31,
    'name': 'device 31',
    'active': 1
  }, {
    'id': 32,
    'name': 'device 32',
    'active': 0
  }, {
    'id': 33,
    'name': 'device 33',
    'active': 1
  }]  
}]
};

从所有这些“device_groups”数组和内部“devices”数组中,我需要获取一个对象数组,其中“活动”为真 (1)。

如何以 ES6+ 的方式做到这一点?

【问题讨论】:

  • 到目前为止你尝试了什么?
  • @Andreas 尝试使用地图和过滤器,但在中间的某个地方迷路了。试图一步一步地做,但不知何故得到了一个数组数组......
  • 那么请添加您的方法,我们将帮助您解决它。 SO 不是“我需要……请给我一个解决方案”服务。

标签: javascript arrays ecmascript-6 ecmascript-2017


【解决方案1】:

您可以像这样使用mapfilter

var DATA={'device_groups':[{'id':'1','name':'group 1','devices':[{'id':11,'name':'device 11','active':1},{'id':12,'name':'device 12','active':0},{'id':13,'name':'device 13','active':0}]},{'id':'2','name':'group 2','devices':[{'id':21,'name':'device 21','active':1},{'id':22,'name':'device 22','active':0},{'id':23,'name':'device 23','active':1}]},{'id':'3','name':'group 3','devices':[{'id':31,'name':'device 31','active':1},{'id':32,'name':'device 32','active':0},{'id':33,'name':'device 33','active':1}]}]}

const filtered = DATA.device_groups.map(a => a.devices.filter(a => a.active === 1)),
  output = [].concat(...filtered);

console.log(output)

或者使用简单的reduce

var DATA={'device_groups':[{'id':'1','name':'group 1','devices':[{'id':11,'name':'device 11','active':1},{'id':12,'name':'device 12','active':0},{'id':13,'name':'device 13','active':0}]},{'id':'2','name':'group 2','devices':[{'id':21,'name':'device 21','active':1},{'id':22,'name':'device 22','active':0},{'id':23,'name':'device 23','active':1}]},{'id':'3','name':'group 3','devices':[{'id':31,'name':'device 31','active':1},{'id':32,'name':'device 32','active':0},{'id':33,'name':'device 33','active':1}]}]}

const devices = DATA.device_groups
                  .reduce((a,d) => a.concat(d.devices.filter(f => f.active)),[]);

console.log(devices)

【讨论】:

  • 谢谢!看起来像我需要的,而且比我尝试做的更有效率......
【解决方案2】:

您可以使用reducefilter 来实现。

通过过滤器,我们只从devices 中取出状态为active 的元素,然后将它们连接到final output

var DATA={'device_groups':[{'id':'1','name':'group 1','devices':[{'id':11,'name':'device 11','active':1},{'id':12,'name':'device 12','active':0},{'id':13,'name':'device 13','active':0}]},{'id':'2','name':'group 2','devices':[{'id':21,'name':'device 21','active':1},{'id':22,'name':'device 22','active':0},{'id':23,'name':'device 23','active':1}]},{'id':'3','name':'group 3','devices':[{'id':31,'name':'device 31','active':1},{'id':32,'name':'device 32','active':0},{'id':33,'name':'device 33','active':1}]}]}

let output = DATA.device_groups.reduce((op,cur)=>{
  let temp = cur.devices.filter(ele=> ele.active)
  op = op.concat(temp)
  return op;
},[])

console.log(output)

【讨论】:

  • 你应该解释你做了什么,否则这只是一个代码转储。
  • @Andy 当然。正在添加解释以回答。
【解决方案3】:

基本上你可以使用reducefilter来实现你想要的

var DATA = {
  'device_groups': [{
    'id': '1',
    'name': 'group 1',
    'devices': [{
      'id': 11,
      'name': 'device 11',
      'active': 1
    }, {
      'id': 12,
      'name': 'device 12',
      'active': 0
    }, {
      'id': 13,
      'name': 'device 13',
      'active': 0
    }]
  }, {
    'id': '2',
    'name': 'group 2',
    'devices': [{
      'id': 21,
      'name': 'device 21',
      'active': 1
    }, {
      'id': 22,
      'name': 'device 22',
      'active': 0
    }, {
      'id': 23,
      'name': 'device 23',
      'active': 1
    }]
  }, {
    'id': '3',
    'name': 'group 3',
    'devices': [{
      'id': 31,
      'name': 'device 31',
      'active': 1
    }, {
      'id': 32,
      'name': 'device 32',
      'active': 0
    }, {
      'id': 33,
      'name': 'device 33',
      'active': 1
    }]
  }]
};
const deviceGroups = DATA.device_groups;

const solution = deviceGroups.reduce((result, devicegroup) => {
  const filteredDevices = devicegroup.devices.filter(device => device.active === 1)
  return [...result, ...filteredDevices]
}, [])

console.log(solution)

【讨论】:

    【解决方案4】:

    使用reducedevices 的内部数组从每个device_groups 合并到一个devices 数组中。然后用active === 1过滤合并后的数组,得到一个活跃的设备数组。

    var DATA = {"device_groups":[{"id":"1","name":"group 1","devices":[{"id":11,"name":"device 11","active":1},{"id":12,"name":"device 12","active":0},{"id":13,"name":"device 13","active":0}]},{"id":"2","name":"group 2","devices":[{"id":21,"name":"device 21","active":1},{"id":22,"name":"device 22","active":0},{"id":23,"name":"device 23","active":1}]},{"id":"3","name":"group 3","devices":[{"id":31,"name":"device 31","active":1},{"id":32,"name":"device 32","active":0},{"id":33,"name":"device 33","active":1}]}]};
    
    var devices = DATA.device_groups
                      .reduce((acc, ele) => {
                         acc = acc.concat([...ele['devices']]); //merging each device array with the next with the concat().
                         return acc;
                       },[])
                      .filter((data) => data['active'] === 1);
    console.log(devices);

    【讨论】:

      【解决方案5】:

      您可以只使用forEach 并传播... 运算符并在最终数组中推送active 属性为真的过滤结果

      var DATA = {'device_groups': [{'id': '1','name': 'group 1','devices': [{'id': 11,'name': 'device 11','active': 1}, {'id': 12,'name': 'device 12','active': 0}, {'id': 13,'name': 'device 13','active': 0}] }, {'id': '2','name': 'group 2','devices': [{'id': 21,'name': 'device 21','active': 1}, {'id': 22,'name': 'device 22','active': 0}, {'id': 23,'name': 'device 23','active': 1
        }]}, {'id': '3','name': 'group 3','devices': [{'id': 31,'name': 'device 31','active': 1}, {'id': 32,'name': 'device 32','active': 0}, {'id': 33,'name': 'device 33','active': 1}]}]};
      
      const result =[];
      DATA.device_groups.forEach(devGroup => result.push(...devGroup.devices.filter(d => d.active)));
      console.log(result);

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2018-06-12
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-11-04
        • 1970-01-01
        相关资源
        最近更新 更多