У меня есть несколько объектов 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
Как я могу получить доступ к вложенному объекту «продукты» внука независимо от имени родителей?
В конце концов, более общий способ: Object.values(ecommerce).find(item => typeof item === 'object' && item !== null && !!item.products)
Возможный дубликат Динамический доступ к свойству объекта с использованием переменной



![Безумие обратных вызовов в javascript [JS]](https://i.imgur.com/WsjO6zJb.png)


Вы можете просто прокрутить объект 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']
Это делает то, что мне нужно, спасибо. Спасибо также за дополнительную информацию о том, почему мое «регулярное выражение» не работает.
Допустим, у вас есть такой объект::
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;
и запустить без ошибок.
Регулярное выражение, описывающее вышеизложенное: /ecommerce.[add|remove|detail|checkout|purchase].products/. Но если вам нужно доступ - регулярного выражения может быть недостаточно, поскольку вам нужно использовать чек об оплате, какой шаблон применяется.