【问题标题】:I need to find a key in an array of objects and match it with Regex我需要在对象数组中找到一个键并将其与正则表达式匹配
【发布时间】:2017-08-04 02:11:05
【问题描述】:

我已经失去了超过 3 天的时间,但仍然没有成功。这可能就像大海捞针一样,但我仍然需要这样做。

我正在尝试在对象数组中查找键,如果它包含 (a)(b),请将某个键设置为 true

但是,我在某处犯了错误,但我不知道在哪里。

这是我现在拥有的:

let reg = /\((.+?)\)/;
let aggregatedArray: Array<any> = [];
const allWeeksDescription = this.selectedPlan.weeklyOffer;
console.log(allWeeksDescription);
let prop = 'description';
for (prop in allWeeksDescription) {
    allWeeksDescription[prop].forEach(function(k:any) {
          aggregatedArray.push(k.description);
          console.log(aggregatedArray);
     })
}

但是,我在控制台中收到了这个错误(不过,我确实得到了一个 console.logged 之后成功):

原始异常:allWeeksDescription[prop].forEach 不是 功能

我需要做的就是找到key ('description'),如果它的值与RegEx匹配成功,然后将另一个key ('exists')设置为true。如果没有,请保持原样 - false。应该使用存储在此变量中的 RegEx 进行匹配:

let reg = /\((.+?)\)/;

在控制台中我收到如下信息:

{
   monday: [
         {
            description: "(a)",
            exists: false
         },
         {
            description: "(a)",
            exists: false
         },
         {
            description: "(a)",
            exists: false
         },
         {
            description: "(a)",
            exists: false
         },
         {
            description: "(a)",
            exists: false
         }
        ]
tuesday:  [
         {
            description: "test",
            exists: false
         },
         {
            description: "test",
            exists: false
         },
         {
            description: "test",
            exists: false
         },
         {
            description: "test",
            exists: false
         },
         {
            description: "test",
            exists: false
         }
        ]
     }

总之,我需要得到description keys 并将它们与Regex 匹配。如果匹配,key exists 的值应为true。如果没有,它应该保持现在的状态 - false

请帮帮我,我为此浪费了太多天。

谢谢大家。

【问题讨论】:

  • @Kinduser,嗨,伙计。您能否发布一个完整的工作示例作为答案?谢谢老兄。
  • 我需要allWeeksDescription 对象(:
  • 哦,抱歉,我这里没有……我在家。 :(请问有什么可以做的吗?
  • ValLeNain 已经帮助了你,我希望他的解决方案对你有用,但如果没有 - 请告诉我 - 我会尝试解决它。​​
  • 明天之前我不能测试。我很好奇 VaILeNain 的评论。您认为将其保存在单独的文件中会更好吗?

标签: javascript arrays json regex object


【解决方案1】:

下面是如何在匿名类型对象上运行 foreach 循环。您需要做的是获取对象的所有键,并假设它们具有相同的结构,您需要确保它们与模式匹配。

let reg = /\((.+?)\)/;
let aggregatedArray = [];
const allWeeksDescription = this.selectedPlan.weeklyOffer;
console.log(allWeeksDescription);
let prop = 'description';
Object.keys(allWeeksDescription).forEach(function(k) {
    reg.match(allWeeksDescription[k]) && aggregatedArray.push(k.description);
    console.log(aggregatedArray);
})

【讨论】:

  • 请做匹配逻辑。谢谢老兄。
  • 如果您使用相同的变量来保持对allWeeksDescription 索引的引用,为什么首先将prop 设置为“描述”? :)
  • 哦,我错过了。我一开始无法测试代码,因为提问者一开始没有提供数据:)
  • 哦,我的错.. :)
  • 请将存在更改为真。谢谢。 )
【解决方案2】:

如果您在帖子底部描述的对象是 allWeeksDescription,那么您需要将您的 for 循环更改为:

  let matchingDays = []; // to keep a track of matching days
  for(let dayLabel in allWeeksDescription) {
      /* This is one day (= an array), in your first object */
      let day = allWeeksDescription[dayLabel];
      /* Go through all of its elements */
      day.forEach( d => {
        /* `d` is one element of the array */

        /* Check if it matches your regex */
        if(d.description.search(reg) !== -1) {
          /* do whatever you want here, you know that the description matches your regex */
          d.exists = true;
          matchingDays.push(day);
        }
      });
    }

【讨论】:

  • 等待.. !== 匹配正则表达式??怎么样??
  • 我正在使用这个函数 (developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/…),它告诉字符串是否匹配正则表达式(如果有则返回匹配的索引,否则返回 -1)。
  • 这是我第一次看到它实现。希望您的解决方案能够奏效。您能否完成它,以便将存在设置为“true”?谢谢。
  • 您可以声明一个单独的数组,并将具有匹配描述的日期存储在其中(调用yourArray.push(day);,我在其中d.exists = true;
  • @eric.dummy 是的 :)
猜你喜欢
  • 2021-10-13
  • 2010-09-23
  • 2014-02-06
  • 2020-08-05
  • 1970-01-01
  • 2018-11-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多