[英]how to filter nested object in es6 and return the parent
我有一个包含嵌套对象的对象。 我想通过它们过滤并返回密钥(如果存在)。
例如:
var meals = {
food_meals: [
{meal_id: 15749, address_required: false, button_text: "choose", can_choose_meal: true},
{meal_id: 15750, address_required: false, button_text: "choose", can_choose_meal: true}
],
wine_meals: [
{meal_id: 11651, address_required: false, button_text: "choose", can_choose_meal: true},
{meal_id: 4424, address_required: false, button_text: "choose", can_choose_meal: true}
],
kids_meals: [
{meal_id: 15763, address_required: false, button_text: "choose", can_choose_meal: true},
{meal_id: 15764, address_required: false, button_text: "choose", can_choose_meal: true},
{meal_id: 15765, address_required: false, button_text: "choose", can_choose_meal: true}
]
}
如果我有一顿饭,其饭餐meal_id
为15764,那么我希望返回该值的键(在本例中为kids_meals
)
我可以通过执行以下操作从嵌套对象中过滤餐点
meals.kids_meals.filter(meal => meal.meal_id == this.props.selection.meal_id)
其中this.props.selection.meal_id
为15764
在这种情况下,我想要的输出是“ kids_meals”,但我似乎无法达到它
您可以遍历meals
的Object.entries
以获取键值对数组,并在该数组上使用.find
来获取键值对,其值是包含匹配的meal_id
的数组:
const meals = { food_meals: [ {meal_id: 15749, address_required: false, button_text: "choose", can_choose_meal: true}, {meal_id: 15750, address_required: false, button_text: "choose", can_choose_meal: true} ], wine_meals: [ {meal_id: 11651, address_required: false, button_text: "choose", can_choose_meal: true}, {meal_id: 4424, address_required: false, button_text: "choose", can_choose_meal: true} ], kids_meals: [ {meal_id: 15763, address_required: false, button_text: "choose", can_choose_meal: true}, {meal_id: 15764, address_required: false, button_text: "choose", can_choose_meal: true}, {meal_id: 15765, address_required: false, button_text: "choose", can_choose_meal: true} ] }; const idToFind = 15764; const foundEntry = Object.entries(meals) .find( ([, arr]) => arr.some( ({ meal_id }) => meal_id === idToFind ) ); if (foundEntry) { console.log(foundEntry[0]); }
函数filter
用于创建具有满足特定条件的对象的新数组。 在这种情况下,您需要使用函数find
来提取满足条件的对象。
此替代方法使用功能find
和some
功能来查找至少一个具有特定meal_id
对象。
let meals = { food_meals: [ {meal_id: 15749, address_required: false, button_text: "choose", can_choose_meal: true}, {meal_id: 15750, address_required: false, button_text: "choose", can_choose_meal: true} ], wine_meals: [ {meal_id: 11651, address_required: false, button_text: "choose", can_choose_meal: true}, {meal_id: 4424, address_required: false, button_text: "choose", can_choose_meal: true} ], kids_meals: [ {meal_id: 15763, address_required: false, button_text: "choose", can_choose_meal: true}, {meal_id: 15764, address_required: false, button_text: "choose", can_choose_meal: true}, {meal_id: 15765, address_required: false, button_text: "choose", can_choose_meal: true} ]}, target = 15764, found = Object.keys(meals).find(k => meals[k].some(({meal_id}) => meal_id === target)); console.log(found);
使用Array#filter,Array#findIndex和Object.keys
const data={food_meals:[{meal_id:15749,address_required:!1,button_text:"choose",can_choose_meal:!0},{meal_id:15750,address_required:!1,button_text:"choose",can_choose_meal:!0}],wine_meals:[{meal_id:11651,address_required:!1,button_text:"choose",can_choose_meal:!0},{meal_id:4424,address_required:!1,button_text:"choose",can_choose_meal:!0}],kids_meals:[{meal_id:15763,address_required:!1,button_text:"choose",can_choose_meal:!0},{meal_id:15764,address_required:!1,button_text:"choose",can_choose_meal:!0},{meal_id:15765,address_required:!1,button_text:"choose",can_choose_meal:!0}]} const id = 15764; const res = Object.keys(data).filter(key=>{ return data[key].findIndex(({meal_id})=>meal_id===id) > -1 }).join(""); console.log(res);
我意识到这与@CertainPerformance的答案相对接近,我并不是要说他根本是无效的,但是,您可能会发现这更容易阅读,其次,如果有餐可用于多个类别(您可能没有想到的用例)中,它将返回一个数组。
Object.keys(meals).filter(type => meals[type].some(item => item.meal_id === idToFind));
var meals = { food_meals: [ {meal_id: 15749, address_required: false, button_text: "choose", can_choose_meal: true}, {meal_id: 15750, address_required: false, button_text: "choose", can_choose_meal: true} ], wine_meals: [ {meal_id: 11651, address_required: false, button_text: "choose", can_choose_meal: true}, {meal_id: 4424, address_required: false, button_text: "choose", can_choose_meal: true} ], kids_meals: [ {meal_id: 15763, address_required: false, button_text: "choose", can_choose_meal: true}, {meal_id: 15764, address_required: false, button_text: "choose", can_choose_meal: true}, {meal_id: 15765, address_required: false, button_text: "choose", can_choose_meal: true} ] } let r = Object.keys(meals).filter(type => meals[type].some(item => item.meal_id === 15749)); console.log(r);
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.