首页 > 解决方案 > 删除基于 id 和类型的嵌套数组对象?

问题描述

给定一个嵌套的餐点数组,我们试图移除一个基于 an idandmealType组合的嵌套对象。我们从 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基于idand来定位嵌套对象mealType。伪代码使用 a*来表明这一点。

这些console.log陈述根据mealsList应如何呈现来显示预期结果。

我们正在寻找简短而甜蜜的东西,理想情况下是单衬里,即使这意味着为了简单起见使用 lodash 解决方案。

这是小提琴 (JS标签中的代码)

知道要放置什么而不是伪代码removeItemmealsList删除特定项目吗?

标签: javascriptarrayslodash

解决方案


这是一个纯 JavaScript 解决方案,它遍历 的键mealsList,过滤idmealType然后将结果数组的长度与 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);


推荐阅读