javascript - 返回对象数组中的对象数组中的项
问题描述
我正在尝试根据嵌套数组对象中的布尔值返回主对象中的值。如果主数组中的值是真的,那么它应该在子数组中寻找槽并且只返回那些是真的。我已经尝试了很长时间,但似乎无法找到解决方案。它返回嵌套数组中的所有对象,无论是真还是假。将不胜感激。
const DATA = [
{
day: 'Monday',
label: 'Monday',
checked: false,**strong text**
slots: [
{slot: '9-10', checked: false},
{slot: '10-11', checked: false},
],
},
{
day: 'Tuesday',
label: 'Tuesday',
checked: false,
slots: [
{slot: '9-10', checked: false},
{slot: '10-11', checked: false},
],
},
{
day: 'Wednesday',
label: 'Wednesday',
checked: false,
slots: [
{slot: '9-10', checked: false},
{slot: '10-11', checked: false},
],
},
{
day: 'Thursday',
label: 'Thursday',
checked: false,
slots: [
{slot: '9-10', checked: false},
{slot: '10-11', checked: false},
],
},
{
day: 'Friday',
label: 'Friday',
checked: false,
slots: [
{slot: '9-10', checked: false},
{slot: '10-11', checked: false},
],
},
{
day: 'Saturday',
label: 'Saturday',
checked: false,
slots: [
{slot: '9-10', checked: false},
{slot: '10-11', checked: false},
],
},
];
useEffect(() => {
setDaysCollection(DATA);
}, []);
const selectedDays = daysCollection.filter(
(item: any) =>
item.checked == true &&
item.slots.filter(r => r.checked == true),
);
setSelectedItem(selectedDays);
解决方案
Array.prototype.filter()
期望一个布尔值返回,虽然您可以使用它来改变原始数组,但使用返回的数组会更干净。
这是一个使用some()
断言检查槽的示例,以及map()
进一步过滤嵌套数组的调用。
//{ day: 'Tuesday', label: 'Tuesday', checked: true, slots: [{ slot: '9-10', checked: false }, { slot: '10-11', checked: true },], }
const DATA = [{ day: 'Monday', label: 'Monday', checked: false, slots: [{ slot: '9-10', checked: false }, { slot: '10-11', checked: false },], }, { day: 'Tuesday', label: 'Tuesday', checked: true, slots: [{ slot: '9-10', checked: false }, { slot: '10-11', checked: true },], }, { day: 'Wednesday', label: 'Wednesday', checked: false, slots: [{ slot: '9-10', checked: false }, { slot: '10-11', checked: false },], }, { day: 'Thursday', label: 'Thursday', checked: false, slots: [{ slot: '9-10', checked: false }, { slot: '10-11', checked: false },], }, { day: 'Friday', label: 'Friday', checked: false, slots: [{ slot: '9-10', checked: false }, { slot: '10-11', checked: false },], }, { day: 'Saturday', label: 'Saturday', checked: false, slots: [{ slot: '9-10', checked: false }, { slot: '10-11', checked: false },], },];
const result = DATA
.filter(({ checked, slots }) =>
checked && slots.some(({ checked }) => checked)
)
.map(o => ({ ...o, slots: o.slots.filter(({ checked }) => checked) }));
console.log(result);
推荐阅读
- excel - 如何解锁新 OLEObject 添加附件的纵横比?
- javascript - 如何在提交表单时显示引导模式?
- excel - 有没有办法用公式模拟excel中的过滤功能?
- java - 我正在尝试更改幻灯片中折线图的值,但无法使用 POI
- r - 尝试使用 R 在 excel 工作簿中创建多个工作表,但在几次之后收到错误
- c++ - 当通过引用设置类时会发生什么
- ios - Swift - 当收到静默通知时决定是否显示警报
- vba - 如何在子窗体中获得焦点控件?
- r - Microsoft 更新后 MS Word 2010 中的 devEMF 输出显示问题
- swagger - 如何为 requestBody of content "text / csv (UTF-8)" 定义 Open Api 3.0 文档