RegEx для доступа к вложенному объекту

У меня есть несколько объектов JS, и у каждого из них есть дочернее свойство, называемое «продукты».

Например. ecommerce.add.products, ecommerce.remove.products, ecommerce.detail.products, ecommerce.checkout.products, ecommerce.purchase.products

Я хотел бы получить доступ к массиву продуктов независимо от того, что это за конкретный объект из вышеперечисленного.

Пробовал использовать регулярное выражение:

var ecomProducts = ecom[('detail'|'add'|'remove'|'checkout'|'purchase')]['products'];

TypeError: ecom[(((("detail" | "add") | "remove") | "checkout") | "purchase")] is undefined

var ecomProducts = ecom[/'detail'|'add'|'remove'|'checkout'|'purchase'/]['products'];

TypeError: ecom[/'detail'|'add'|'remove'|'checkout'|'purchase'/] is undefined

Как я могу получить доступ к вложенному объекту «продукты» внука независимо от имени родителей?

Регулярное выражение, описывающее вышеизложенное: /ecommerce.[add|remove|detail|checkout|purchase].products/. Но если вам нужно доступ - регулярного выражения может быть недостаточно, поскольку вам нужно использовать чек об оплате, какой шаблон применяется.

Mulli 27.05.2019 03:23

В конце концов, более общий способ: Object.values(ecommerce).find(item => typeof item === 'object' && item !== null && !!item.products)

bigless 27.05.2019 03:30
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
1
3
258
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

Вы можете просто прокрутить объект ecom и проверить наличие следующих реквизитов detail','add','remove','checkout','purchase' на объекте ecom,

что-то вроде этого

let outerKey = ['detail','add','remove','checkout','purchase']
let foundProducts = outerKey.reduce((op,inp) => {
      if (ecom[inp] && ecom[inp].products && ecom[inp].products.length){
      op.push(ecom[inp].products)
      }  
     return op
},[])

Tried using regex:

var ecomProducts = ecom[('detail'|'add'|'remove'|'checkout'|'purchase')]['products'];

Нет, это не регулярное выражение, это просто логическое ИЛИ, поэтому вы всегда заканчиваете на ecom['checkout']['products']

Это делает то, что мне нужно, спасибо. Спасибо также за дополнительную информацию о том, почему мое «регулярное выражение» не работает.

Doug Fir 27.05.2019 03:58

Допустим, у вас есть такой объект::

ecommerce = { 
   add: { products: ['add products'] },
   remove: { products: ['remove'] },
   detail: { products: ['prod details'] },
   checkout: { products: ['checkout'] },
   purchase: { products: ['purchase'] }
};

    for( var x in ecommerce )"products" in ecommerce[ x ] ? 
    console.info( ecommerce[ x ].products ) : 0;

Вы не можете собирать яблоки с любого дерева, на котором вы встретитесь - вам нужно будет посетить деревья и ветки, на которых они растут...

Самый простой и переносимый способ — использовать функцию, использующую следующее выражение::

for( var x in ecommerce )"products" in ecommerce[ x ] ? 
console.info( ecommerce[ x ].products ) : 0;

и запустить без ошибок.

Другие вопросы по теме