【问题标题】:mapping and filtering chaining映射和过滤链
【发布时间】:2017-02-27 06:53:06
【问题描述】:

数据是这样的

[{time: '09:00', 'level':'x3', 'type':'ae'}
time: '10:00', 'level':'x6', 'type':'fe'}
time: '09:00', 'level':'y3', 'type':'hy'}
time: '11:00', 'level':'z3', 'type':'hy'}]

我想要得到的结果: 按时间过滤 - 09:00,并为相同种类创建拆分数组。

示例结果:

{"levels": [ "x3","y3"],"types": ["ae","hy"]}

我可以在三个函数(过滤器和地图)中做到这一点,但我想将它们链接起来。是否有可能以更优雅的方式?

提前致谢。

【问题讨论】:

  • 你现在怎么样了?
  • @A.Lau,过滤、映射和映射。
  • 预期的结果是不可能的,因为它有两个同名的属性。
  • 您想要的输出无效!
  • @NinaScholz 这不是唯一的问题,OP 还试图将对象术语放入数组容器中

标签: javascript functional-programming


【解决方案1】:

注意:结果将是一个包含两个数组的对象。要获取该对象,您可以像这样使用reduce:

var arr = [
  {time: '09:00', 'level':'x3', 'type':'ae'},
  {time: '10:00', 'level':'x6', 'type':'fe'},
  {time: '09:00', 'level':'y3', 'type':'hy'},
  {time: '11:00', 'level':'z3', 'type':'hy'}
];

var result = arr.filter(o => o.time === '09:00')
                .reduce((acc, o) => {
                    acc.levels.push(o.level);
                    acc.types.push(o.type);
                    return acc;
                }, {levels: [], types: []});
   
console.log(result);

【讨论】:

    【解决方案2】:

    只需过滤和映射您想要的属性,并获得一个具有所需属性和数组中所有值的对象。

    var array = [{time: '09:00', 'level':'x3', 'type':'ae'}, {time: '10:00', 'level':'x6', 'type':'fe'},{time: '09:00', 'level':'y3', 'type':'hy'},{time: '11:00', 'level':'z3', 'type':'hy'}],
        result = array.
            filter(a => a.time === '09:00').
            map(({ level, type }) => ({ level, type })).
            reduce((r, o, i) => (Object.keys(o).forEach(k => (r[k] = r[k] || []).push(o[k])), r), {});
        
    console.log(result);

    【讨论】:

    • 我支持你,但似乎这不是正确的解决方案;d
    • @Kinduser,其实OP的请求结果是无效的。
    • 其实他想要的解决方案很明确,但无论如何我又从你那里学到了一些新东西。
    • @Nina,可能是你被否决了。我应该在这里再次解释一下,JSON 是比喻性的。
    【解决方案3】:

    var tmp = [{time: '09:00', 'level':'x3', 'type':'ae'},
      {time: '10:00', 'level':'x6', 'type':'fe'},
      {time: '09:00', 'level':'y3', 'type':'hy'},
      {time: '11:00', 'level':'z3', 'type':'hy'}];
    
    var result = {}; result.levels = []; result.types = [];
    
    tmp.filter(data => data.time === '09:00').map(data => {
      result.levels.push(data.level);
      result.types.push(data.type);
    });
    
    console.log(result);

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-12-09
      • 2020-01-02
      • 2020-11-23
      • 1970-01-01
      • 1970-01-01
      • 2016-06-11
      • 2016-03-27
      • 2022-01-14
      相关资源
      最近更新 更多