【问题标题】:Substring in array of objects对象数组中的子字符串
【发布时间】:2020-02-23 21:54:59
【问题描述】:

使用 Node.js 10.*

我收到了以下数据结构:

const result = [
  {
    ID: 1,
    Reference: 'Id: 123, Name: "first'
  },
  {
    ID: 2,
    Reference: 'Name: "second'
  },
  {
    ID: 3,
    Reference: 'Id: 133, Name: "third'
  }
];

我想捕获每个引用的 ID(如果存在),然后推送到一个新数组,这将为我提供以下信息:

// [123,133]

我可以使用 Filter 和 Map 过滤掉 Reference 中不包含 'Id' 的内容,方法如下:

let filter = result.filter(i => i.Reference.includes('Id:')).map(i => i.Reference)

这给了我:

// ['Id': 123, Name: 'first, 'Id': 133, Name: 'third'] 

所以从上面的数组中,我只是去掉 Id 得到:

// [123,133]

使用子字符串似乎对我不起作用。

【问题讨论】:

  • 字符串的Id: 123 部分的长度是否已知?如果是这样,您可以提取该部分。如果不是,那么结构是否总是相同的? Id: <digits> 后跟逗号?

标签: javascript arrays node.js filter substring


【解决方案1】:

如果您只是从Id:(四个字符,因此字符串中的索引为 3)和出现在数字之后的第一个逗号之后提取文本部分,则可以使用简单的数组操作:

const result = [ { ID: 1, Reference: 'Id: 123, Name: "first' }, { ID: 2, Reference: 'Name: "second' }, { ID: 3, Reference: 'Id: 133, Name: "third' } ]; 

function extractId(reference) {
  let from = 3;
  let to = reference.indexOf(",");
  
  return reference.slice(from, to);
}

let ids = result
  .filter(i => i.Reference.includes('Id:'))
  .map(i => i.Reference)
  .map(extractId)
  .map(Number);
  

console.log(ids);

或者,您可以使用正则表达式来捕获和提取 ID

const result = [ { ID: 1, Reference: 'Id: 123, Name: "first' }, { ID: 2, Reference: 'Name: "second' }, { ID: 3, Reference: 'Id: 133, Name: "third' } ]; 

function extractId(reference) {
  let regex = /Id: (\d+)/;
  
  return reference.match(regex)[1];
}

let ids = result
  .filter(i => i.Reference.includes('Id:'))
  .map(i => i.Reference)
  .map(extractId)
  .map(Number);
  

console.log(ids);

【讨论】:

    【解决方案2】:

    您可以使用正则表达式映射该部分并返回一个数字。

    const
        result = [{ ID: 1, Reference: 'Id: 123, Name: "first' }, { ID: 2, Reference: 'Name: "second' }, { ID: 3, Reference: 'Id: 133, Name: "third' }],
        filter = result
            .filter(i => i.Reference.includes('Id:'))
            .map(i => i.Reference)
            .map(s => +s.match(/Id:\s*(\d+)/)[1])
    
    console.log(filter);

    【讨论】:

      【解决方案3】:

      使用正则表达式,您可以从字符串中删除您的号码

      const Reference = 'Id: 133, Name: "third'
      
      console.log(
        (/Id:\s(\d+),/g).exec(Reference)[1]
      );

      最终解决方案:

      const result = [
        {
          ID: 1,
          Reference: 'Id: 123, Name: "first'
        },
        {
          ID: 2,
          Reference: 'Name: "second'
        },
        {
          ID: 3,
          Reference: 'Id: 133, Name: "third'
        }
      ];
      
      const res = result
        .map(({Reference})=>+((/Id:\s(\d+),/g).exec(Reference)||[])[1])
        .filter(item=>!!item)
      
      console.log(res);

      【讨论】:

        猜你喜欢
        • 2021-12-15
        • 2022-12-02
        • 1970-01-01
        • 2013-01-03
        • 2019-06-16
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-10-24
        相关资源
        最近更新 更多