【问题标题】:Iterating through object Where Value is Array of Objects and return one value from each Objects of Array of Objects遍历对象其中值是对象数组并从对象数组的每个对象返回一个值
【发布时间】:2019-12-13 00:53:11
【问题描述】:

如何从中获取所有office 值并将其存储为一个简单的数组?

var data = {
  'XYZ': [{
      office: 'xyz.in',
      reportName: 'payroll',
      event: 'open',
      timestamp: '02-12-2019 00:15:29'
    },
    {
      office: 'xyz.in',
      reportName: 'payroll',
      event: 'processed',
      timestamp: '02-12-2019 00:15:32'
    }
  ],
  'yyy': [{
      office: 'yyy.in',
      reportName: 'payroll',
      event: 'delivered',
      timestamp: '02-12-2019 00:15:29'
    },
    {
      office: 'yyy.in',
      reportName: 'payroll',
      event: 'open',
      timestamp: '02-12-2019 00:15:32'
    }
  ],
  'zzz': [{
      office: 'xyz.in',
      reportName: 'payroll',
      event: 'delivered',
      timestamp: '02-12-2019 00:15:29'
    },
    {
      office: 'xyz.in',
      reportName: 'payroll',
      event: 'open',
      timestamp: '02-12-2019 00:15:32'
    }
  ]
}

输出应该是这样的:

officesArray = ['xyz.in', 'yyy.in', 'xyz.in']

我的代码是

var Office = (Object.entries(grpDatas).flatMap(([k, v]) => (v.forEach(({office})=> office))))

它打印array of undefined

【问题讨论】:

标签: javascript arrays object


【解决方案1】:

使用map 而不是forEach 并且您访问的是email 而不是office

var data = {
  'XYZ': [{
      office: 'xyz.in',
      reportName: 'payroll',
      event: 'open',
      timestamp: '02-12-2019 00:15:29'
    },
    {
      office: 'xyz.in',
      reportName: 'payroll',
      event: 'processed',
      timestamp: '02-12-2019 00:15:32'
    }
  ],
  'yyy': [{
      office: 'yyy.in',
      reportName: 'payroll',
      event: 'delivered',
      timestamp: '02-12-2019 00:15:29'
    },
    {
      office: 'yyy.in',
      reportName: 'payroll',
      event: 'open',
      timestamp: '02-12-2019 00:15:32'
    }
  ],
  'zzz': [{
      office: 'xyz.in',
      reportName: 'payroll',
      event: 'delivered',
      timestamp: '02-12-2019 00:15:29'
    },
    {
      office: 'xyz.in',
      reportName: 'payroll',
      event: 'open',
      timestamp: '02-12-2019 00:15:32'
    }
  ]
}

var Email = Object.values(data).flatMap(item => [...new Set(item.map(({office})=> office))])
console.log(Email)

【讨论】:

  • 我想以这种方式输出 ['xyz.in','yyy.in','xyz.in'] 我用过你的方式。
  • 其实Object.entries这里也不需要,Object.values就够了。
  • 但它返回 2 次,我只想要办公室的每个值。
  • @Amar 那么您需要在内部地图上使用Set 来删除重复项。我已经更新了答案。
  • 是否可以过滤时间戳并根据该事件获取时间戳并将其存储到数组中?
【解决方案2】:

您可以从想要的属性中获取唯一值。

var data = { XYZ: [{ office: 'xyz.in', reportName: 'payroll', event: 'open', timestamp: '02-12-2019 00:15:29' }, { office: 'xyz.in', reportName: 'payroll', event: 'processed', timestamp: '02-12-2019 00:15:32' }], yyy: [{ office: 'yyy.in', reportName: 'payroll', event: 'delivered', timestamp: '02-12-2019 00:15:29' }, { office: 'yyy.in', reportName: 'payroll', event: 'open', timestamp: '02-12-2019 00:15:32' }], zzz: [{ office: 'xyz.in', reportName: 'payroll', event: 'delivered', timestamp: '02-12-2019 00:15:29' }, { office: 'xyz.in', reportName: 'payroll', event: 'open', timestamp: '02-12-2019 00:15:32' }] },
    office = Object.values(data).flatMap(v => [...new Set(v.map(({ office }) => office))]);

console.log(office);

【讨论】:

    【解决方案3】:

    const result = Object.keys(data) .map( key => data[key]) .flat() .map( element => element.office)

    将所有内容转换为数组并将它们展平很有帮助!

    https://codepen.io/t0dorakis/pen/MWYerKL

    【讨论】:

      猜你喜欢
      • 2020-07-21
      • 1970-01-01
      • 2021-11-29
      • 2014-04-14
      • 1970-01-01
      • 2021-12-16
      • 1970-01-01
      • 2019-10-21
      • 1970-01-01
      相关资源
      最近更新 更多