Javascript:在嵌套数组元素上使用array# some和array# every



我有这个键/值对象:

{
"march 2021 - monday": [
{
"day": "MONDAY",
"date": "2021-03-01",
"timetables": [
{
"day": "MONDAY",
"slots": [
"09:00 - 09:30",
"09:30 - 10:00",
...
],
"changed": false
},
{
"day": "MONDAY",
"slots": [
"14:00 - 14:30",
"14:30 - 15:00",
...
],
"changed": false
}
]
},
{
"day": "MONDAY",
"date": "2021-03-08",
"timetables": [
{
"day": "MONDAY",
"slots": [
"09:00 - 09:30",
"09:30 - 10:00",
...
],
"changed": false
},
{
"day": "MONDAY",
"slots": [
"14:00 - 14:30",
"14:30 - 15:00",
...
],
"changed": false
}
]
}
],
"march 2021 - tuesday": [
{
"day": "TUESDAY",
"date": "2021-03-09",
"timetables": [
{
"day": "TUESDAY",
"slots": [
"07:00 - 07:30",
"07:30 - 08:00",
...
],
"changed": false
}
]
}
],
"march 2021 - thursday": [
{
"day": "THURSDAY",
"date": "2021-03-18",
"timetables": [
{
"day": "THURSDAY",
"slots": [
"10:00 - 10:30",
"10:30 - 11:00",
...
],
"changed": false
}
]
}
]
}

我想:

  • 当每个date属性至少有一个时间表的"changed": true时返回true;

我做了这个codepen那里有几次尝试。第二次尝试似乎有效,但我不确定。你认为这是正确的吗?有别的办法能得到我想要的吗?

感谢

我不知道,如果我正确理解return true when there is a "changed": true for at least one timetable for every date property,但以下似乎是一个解决方案。

你的第二次尝试有相同的逻辑,但缺乏一点结构

console.clear()
const portalDays = {
'march 2021 - monday': [
{
day: 'MONDAY',
date: '2021-03-01',
timetables: [
{
day: 'MONDAY',
slots: [
'09:00 - 09:30',
'09:30 - 10:00'
],
changed: false
},
{
day: 'MONDAY',
slots: [
'14:00 - 14:30',
'14:30 - 15:00'
],
changed: false
}
]
},
{
day: 'MONDAY',
date: '2021-03-08',
timetables: [
{
day: 'MONDAY',
slots: [
'09:00 - 09:30',
'09:30 - 10:00'
],
changed: false
},
{
day: 'MONDAY',
slots: [
'14:00 - 14:30',
'14:30 - 15:00'
],
changed: false
}
]
}
],
'march 2021 - tuesday': [
{
day: 'TUESDAY',
date: '2021-03-09',
timetables: [
{
day: 'TUESDAY',
slots: [
'07:00 - 07:30',
'07:30 - 08:00'
],
changed: false
}
]
}
],
'march 2021 - thursday': [
{
day: 'THURSDAY',
date: '2021-03-18',
timetables: [
{
day: 'THURSDAY',
slots: [
'10:00 - 10:30',
'10:30 - 11:00'
],
changed: false
}
]
}
]
};
/*
this second attempt it might be correct but I'm not sure
*/
{
// Use small functions that do one thing
const timeTableHasChanged = tt => hasChanged = tt.changed === true


const dayhasChanged = day => day.timetables.some(timeTableHasChanged)

const portalHasChanged = pd => {
// Use `values()` not `keys()`. You are not interested in the keys here
const pdv = Object.values(pd)
// early return on empty input, so you don't have too many nested conditionals
if (pdv.length === 0) {
return true; // maybe false. Depends on what you want, if the inpout is empty
}
return pdv.every(item => item.every(dayhasChanged))
}


console.log(portalHasChanged(portalDays)) // should by false

portalDays['march 2021 - monday'][0].timetables[0].changed = true
portalDays['march 2021 - monday'][1].timetables[1].changed = true
portalDays['march 2021 - tuesday'][0].timetables[0].changed = true
portalDays['march 2021 - thursday'][0].timetables[0].changed = true
console.log(portalHasChanged(portalDays)) // should be true
}

最新更新