【问题标题】:RegEx for accessing a nested object用于访问嵌套对象的正则表达式
【发布时间】:2019-05-27 01:16:31
【问题描述】:

我有一些 JS 对象,它们每个都有一个名为“products”的孙子属性。

例如ecommerce.add.products, ecommerce.remove.products, ecommerce.detail.products, ecommerce.checkout.products, ecommerce.purchase.products

无论上面的特定对象是什么,我都想访问 products 数组。

尝试使用正则表达式:

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

TypeError: ecom[(((("detail" | "add") | "remove") | "checkout") | "purchase")] 未定义

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

TypeError: ecom[/'detail'|'add'|'remove'|'checkout'|'purchase'/] 未定义

无论父母姓名如何,我如何访问嵌套的孙子“产品”对象?

【问题讨论】:

  • 描述上述内容的正则表达式是:/ecommerce.[add|remove|detail|checkout|purchase].products/。但是如果您需要 access - 正则表达式可能还不够,因为您必须 check 应用哪种模式。
  • 最终更通用的方式:Object.values(ecommerce).find(item => typeof item === 'object' && item !== null && !!item.products)

标签: javascript arrays regex string regex-group


【解决方案1】:

您可以简单地遍历ecom 对象并检查ecom 对象上是否存在以下道具detail','add','remove','checkout','purchase'

类似的东西

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
},[])

尝试使用正则表达式:

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

不,这不是正则表达式,这只是逻辑或,所以你总是以ecom['checkout']['products']结尾

【讨论】:

  • 这可以满足我的需要,谢谢。也感谢您提供有关我的“正则表达式”失败原因的其他信息
【解决方案2】:

假设你有一个这样的对象::

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.log( ecommerce[ x ].products ) : 0;

你不能从你遇到的任何一棵树上捡起苹果——你需要去拜访那些树和包含它们的树枝......

最简单和最便携的方法是拥有一个使用以下表达式的函数::

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

并无错误地运行。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-08-31
    • 1970-01-01
    • 2011-06-12
    • 1970-01-01
    • 1970-01-01
    • 2011-07-18
    • 2019-07-04
    • 2014-06-23
    相关资源
    最近更新 更多