【问题标题】:In array of strings split items (into key-value pairs) and group by common key在字符串数组中拆分项目(成键值对)并按公共键分组
【发布时间】:2021-12-16 21:06:23
【问题描述】:

我正在使用 Angular,并且我在以下结构中输入数据,键 = 字符串,值 = 字符串数组:

  inputObject= {
'employees': [
  'bob/january',
  'bob/january-february',
  'bob/january-march',
  'steve/january',
  'steve/january-february',
  'steve/january-march',
  'september',
],

};

我需要通过使用'/'作为分隔符拆分值来转换此对象,因此拆分员工数组中的字符串元素并将其放入一个新对象中,其中'/'之前的字符串值成为键新对象和 '/' 之后的字符串值作为字符串值数组添加。如果员工元素中的值在字符串中没有“/”,则键应该是硬编码的字符串值,例如“n/a”,如下所示

期望的输出:

  outputObject = {
'bob': [
  'january',
  'january-february',
  'january-march'
],
'steve': [
  'january',
  'january-february',
  'january-march',
],
'n/a': 'september'

}

我尝试了各种技术,其中一个示例在我尝试添加到地图的 sn-p 中看到。这可以通过添加到新对象或您可以推荐的任何其他数据结构来实现。

inputObject= {
    'employees': [
      'bob/january',
      'bob/january-february',
      'bob/january-march',
      'steve/january',
      'steve/january-february',
      'steve/january-march',
      'september',
    ],
  };

  let outputMap = new Map();
  
  let splitValues = inputObject.employees.map(a => a.split('/'));
   console.log(splitValues)
  
  splitValues.forEach(a => {
    if(a.length > 1){
    outputMap.set(a[0], a[1]);
    } else {
    outputMap.set('n/a', a[0])
    }
    
  });
  
  console.log(outputMap)

堆栈闪电战: https://stackblitz.com/edit/angular-ivy-ogbdwv

【问题讨论】:

    标签: javascript arrays angular typescript data-structures


    【解决方案1】:

    Reduce 非常适合将一种数据结构更改为另一种。

    它可能看起来像这样(未经测试):

    type Output = {
      [name:string]: string[]
    }
    
    const output = inputObject.employees.reduce<Output>((acc, curr) => {
      const splitStr = curr.split('/')
    
      if (splitStr.length === 1) {
        return {
          ...acc,
          'n/a': [
            ...acc['n/a'],
            splitStr[0]
          ]
        }
      }
    
      const [name, date] = splitStr;
    
      return {
        ...acc,
        [name]: acc[name]?.length > 0
          ? [...acc[name], date]
          : [date]
      }
    }, {});
    
    console.log(output);
    

    【讨论】:

      【解决方案2】:

      您可以使用Array.prototype.reduce()对项目进行分组,使用String.prototype.match()实现拆分逻辑:

      const input = {
                employees: [
                'bob/january',
                'bob/january-february',
                'bob/january-march',
                'steve/january',
                'steve/january-february',
                'steve/january-march',
                'september',
              ]
            },
            
            
            output = input.employees
              .reduce((acc, str) => {
                const [key = 'n/a', value] = str
                  .match(/(([^/]+)\/)?(.+)/)
                  .slice(2)
                const group = acc[key]
                group
                  ? group.push(value)
                  : acc[key] = [value]
                return acc
              }, {})
            
      console.log(output)
      .as-console-wrapper{min-height:100%;}

      【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-11-06
      • 1970-01-01
      • 1970-01-01
      • 2011-06-22
      • 2015-06-19
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多