数据是这样的
[{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"]}
我可以用三个函数(过滤器和地图)来完成此操作,但我想将它们链接起来。可以用更优雅的方式吗?
提前致谢。
注意:结果将是一个包含两个数组的对象。要获取该对象,您可以像这样使用
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);
只需过滤并映射所需的属性,即可获得具有所需属性和数组中所有值的对象。
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);
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);
这是一个老问题,但当多个数组方法链接在一起时,我总是主张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: [] })
这减少了迭代并给出相同的结果