как отфильтровать вложенный объект в es6 и вернуть родителя - PullRequest
0 голосов
/ 10 января 2019

У меня есть объект, который содержит вложенные объекты. Я хотел бы отфильтровать их и вернуть ключ, если он есть.

например:

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', но я не могу этого достичь

Ответы [ 4 ]

0 голосов
/ 10 января 2019

Я понимаю, что это относительно близко к ответу @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);
0 голосов
/ 10 января 2019

Функция 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);
0 голосов
/ 10 января 2019

Использование фильтра Array #, 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);
0 голосов
/ 10 января 2019

Вы можете перебрать Object.entries из meals, чтобы получить массив пар ключ-значение, и использовать .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]);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...