javascript - 删除基于 id 和类型的嵌套数组对象?
问题描述
给定一个嵌套的餐点数组,我们试图移除一个基于 an id
andmealType
组合的嵌套对象。我们从 2 个嵌breakfast
套餐开始,如果两者都被删除,我们会尝试完全删除父键,因为它现在是空的。
这是我们到目前为止的代码:
var mealsList = {
"menuGroup1": [
{
"id": "b1",
"menuId": "FRPUbgmMiaNH",
"title": "Eggs",
"mealType": "breakfast"
}, {
"id": "b2",
"menuId": "FRPUbgmMiaNH",
"title": "Sandwich",
"mealType": "breakfast"
}
],
"menuGroup2": [
{
"id": "b2",
"menuId": "FRPUbgmMiaNH",
"title": "Fruits",
"mealType": "snack"
}
]
};
console.log(mealsList);
const removeItem = (id, mealType) => {
// pseudocode
// mealsList.*.where("id" == id && "mealType" == mealType).remove();
}
// Remove breakfast with id and meal_type
// removeItem(id, mealType)
removeItem('b1', 'breakfast');
console.log('removed b1 breakfast, mealsList should only contain b2 object');
console.log(mealsList);
removeItem('b2', 'breakfast');
console.log('removed b2 breakfast, mealsList should only contain menuGroup2, as menuGroup1 is now empty');
console.log(mealsList);
问题是我们试图在removeItem
没有明确传递的情况下删除嵌套的餐对象menuGroupX
,相反,我们试图mealsList
基于id
and来定位嵌套对象mealType
。伪代码使用 a*
来表明这一点。
这些console.log
陈述根据mealsList
应如何呈现来显示预期结果。
我们正在寻找简短而甜蜜的东西,理想情况下是单衬里,即使这意味着为了简单起见使用 lodash 解决方案。
这是小提琴 (JS标签中的代码)
知道要放置什么而不是伪代码removeItem
来mealsList
删除特定项目吗?
解决方案
这是一个纯 JavaScript 解决方案,它遍历 的键mealsList
,过滤id
,mealType
然后将结果数组的长度与 0 进行比较;如果为 0,则从以下位置删除该密钥mealsList
:
var mealsList = {
"menuGroup1": [{
"id": "b1",
"menuId": "FRPUbgmMiaNH",
"title": "Eggs",
"mealType": "breakfast"
}, {
"id": "b2",
"menuId": "FRPUbgmMiaNH",
"title": "Sandwich",
"mealType": "breakfast"
}],
"menuGroup2": [{
"id": "b2",
"menuId": "FRPUbgmMiaNH",
"title": "Fruits",
"mealType": "snack"
}]
};
console.log(mealsList);
const removeItem = (id, mealType) => {
Object.keys(mealsList).forEach(k => (mealsList[k] = mealsList[k].filter(m => m.id != id || m.mealType != mealType)).length == 0 && delete mealsList[k]);
}
// Remove breakfast with id and meal_type
// removeItem(id, mealType)
removeItem('b1', 'breakfast');
console.log('removed b1 breakfast, mealsList should only contain b2 object');
console.log(mealsList);
removeItem('b2', 'breakfast');
console.log('removed b2 breakfast, mealsList should only contain menuGroup2, as menuGroup1 is now empty');
console.log(mealsList);
推荐阅读
- vba - adodb sql 连接在某些机器上出现运行时错误
- java - 撤销操作是否等待消费过程在 Kafka 重新平衡中完成?
- php - Angular http POST 无法发送帖子参数
- java - Spring混淆字符串后:与JDBC数据源URL中的端口
- unity3d - 当用户在虚拟现实中使用 Leap Motion 用手旋转对象时,如何触发事件?
- c# - 通过标签找到某个按钮的最佳方法是什么?
- php - composer global 需要 laravel/installer
- javascript - 通过参考(Reactjs)访问事件设置中的状态?
- fullcalendar - 事件的完整日历周视图宽度不正确
- javascript - 恢复中止的 AJAX 请求