映射和过滤链接

问题描述 投票:0回答:4

数据是这样的

[{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"]}

我可以用三个函数(过滤器和地图)来完成此操作,但我想将它们链接起来。可以用更优雅的方式吗?

提前致谢。

javascript functional-programming
4个回答
2
投票

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

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);


0
投票

只需过滤并映射所需的属性,即可获得具有所需属性和数组中所有值的对象。

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);


0
投票

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);


0
投票

这是一个老问题,但当多个数组方法链接在一起时,我总是主张ONLY使用

reduce

const 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'}
]

const result = tmp.reduce((acc, { time, level, type }) => {
    if (time === '09:00') {
        acc.levels.push(level)
        acc.types.push(type)
    }
    return acc
}, { levels: [], types: [] })

这减少了迭代并给出相同的结果

© www.soinside.com 2019 - 2024. All rights reserved.