给定一组嵌套的进餐,我们尝试删除基于id
和mealType
组合的嵌套对象。我们从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
和定位嵌套对象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);
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句