有一个对象数组,需要用2个标准来过滤它。其中一个标准是指数递增。
let data =
[{"hour": 1, "dayIndex": 0, "value": "something"},
{"hour": 1, "dayIndex": 1, "value": "something"},
{"hour": 1, "dayIndex": 3, "value": "something"},
{"hour": 2, "dayIndex": 0, "value": "something"},
{"hour": 2, "dayIndex": 1, "value": "something"},
// and so on
]
我需要一个由"小时"过滤的对象数组。和升序" dayIndex"并且重要的是,对于缺少dayIndexes,将创建一个空对象。所以对于小时= 1,我需要这个:
let hourOneArray =
[
{"hour" : 1, "dayIndex": 0, "value": "something"},
{"hour" : 1, "dayIndex": 1, "value": "something"},
{}, //empty because dayIndex 2 is missing
{"hour" : 1, "dayIndex": 3, "value": "something"},
{}, //empty because dayIndex 4 is missing
]
我的方法是:
for(let i = 0; i < 4; ++i){
hourOneArray = data.filter((arg) => {
return ((arg.hour === 1) && (arg.dayIndex === i));
})
}
提前致谢
答案 0 :(得分:1)
这是一个快速而干净的解决方案,可以按小时过滤所有这些,填补空白日期。利用地图并减少:D
let data =
[{"hour": 1, "dayIndex": 0, "value": "something"},
{"hour": 1, "dayIndex": 1, "value": "something"},
{"hour": 1, "dayIndex": 3, "value": "something"},
{"hour": 2, "dayIndex": 0, "value": "something"},
{"hour": 2, "dayIndex": 1, "value": "something"},
// and so on
]
let defaultArr = [];
data.forEach(val => defaultArr.push({}));
let output = data.reduce((hash, val) => {
let hour = val.hour;
let dayIndex = val.dayIndex;
if(!hash[hour]) hash[hour] = defaultArr.map(val => val);
hash[hour][dayIndex] = val;
return hash;
}, {})
console.log(output);
答案 1 :(得分:0)
let data =
[{"hour": 1, "dayIndex": 0, "value": "something"},
{"hour": 1, "dayIndex": 1, "value": "something"},
{"hour": 1, "dayIndex": 3, "value": "something"},
{"hour": 2, "dayIndex": 0, "value": "something"},
{"hour": 2, "dayIndex": 1, "value": "something"}]
data= data.sort((a,b)=>a.dayIndex-b.dayIndex);
data = data.map(val=>val.hour == 1?val:{});
console.log(data);
答案 2 :(得分:0)
您可以尝试以下
let data = [{"hour": 1, "dayIndex": 0, "value": "something"},{"hour": 1, "dayIndex": 1, "value": "something"},{"hour": 2, "dayIndex": 0, "value": "something"},{"hour": 2, "dayIndex": 1, "value": "something"},{"hour": 1, "dayIndex": 3, "value": "something"}];
// Sort the array by hour and dayIndex
data.sort((a,b) => a.hour - b.hour || a.dayIndex - b.dayIndex);
function getHourData(hour) {
// Get the hour data
var hourData = data.filter((a) => a.hour === hour);
// Now, iterate till the maximum dayIndex of the filtered array
for (let i = 0; i < hourData[hourData.length -1].dayIndex; i++) {
// If the index is different from dayIndex, count it as missing and add it to the array
if(i !== hourData[i].dayIndex) hourData.splice(i,0, {});
}
// return result
return hourData;
}
console.log(getHourData(1));
答案 3 :(得分:0)
您可reduce
进入dayIndex
索引的对象,然后为每个缺失日添加对象,无需排序(O(n)
):
const input =
[{"hour": 1, "dayIndex": 0, "value": "something"},
{"hour": 1, "dayIndex": 1, "value": "something"},
{"hour": 1, "dayIndex": 3, "value": "something"},
{"hour": 2, "dayIndex": 0, "value": "something"},
{"hour": 2, "dayIndex": 1, "value": "something"},
];
const [groupedByDay, haveDays] = input
.reduce(([groupedByDay, haveDays], item) => {
const { hour, dayIndex } = item;
if (hour === 1 && !groupedByDay[dayIndex]) {
groupedByDay[dayIndex] = item;
haveDays.push(dayIndex);
}
return [groupedByDay, haveDays];
}, [{}, []]);
const length = Math.max(...haveDays) + 1;
const hourOneArray = Array.from({ length }, (_, i) => (
groupedByDay[i] ? groupedByDay[i] : {}
));
console.log(hourOneArray);
&#13;