【问题标题】:Splitting string into array based on first and last根据第一个和最后一个将字符串拆分为数组
【发布时间】:2022-06-11 03:29:34
【问题描述】:

我有这个数组:-

var a = ['DL1,C1,C5,C6','M4,DL3-7,B1-5']

我想把它们分开

[DL1,C1,C5,C6,M4,DL3,DL4,DL5,DL6,DL7,B1,B2,B3,B4,B5]

所以DL3-7DL3-DL7 这个Split 像这样DL3,DL4,DL5,DL6,DL7

我这样做的原因是因为我想阻止像DL3 这样的重复条目不应该出现在其他任何地方,我正在尝试循环来执行此操作,只是想知道是否有更简单的方法可以做到这一点,然后检查是否有重复。

谢谢

【问题讨论】:

    标签: javascript


    【解决方案1】:

    你必须把你的问题分解成三个部分:

    1. 将逗号分隔的值放入不同的数组项中
    2. "DL3-7" 解析为"DL3", "DL4"...
    3. 删除重复项

    一旦你把问题分解了,一一处理就容易多了。代码可读性很强,如果有什么难以理解的地方,请告诉我。

    const a = ['DL1,C1,C5,C6', 'M4,DL3-7,B1-5']
    
    //this will split all comma delimited values
    const commaDelimit = a.map(item => item.split(',')).flat();
    console.log("Separate values by comma: ")
    console.log(commaDelimit);
    
    //this will turn the ranges into individual items
    //this does not account for if the number is bigger than 9. 
    //you can try doing this part yourself if you need to, should be a good learning exercise.
    const resolveRange = commaDelimit.map(item => {
      if (item.includes('-')) {
        const pos = item.indexOf('-');
        const beginning = Number(item.charAt(pos - 1));
        const end = Number(item.charAt(pos + 1)) + 1;
    
        const toReturn = [];
        const prependString = item.substring(0, pos - 1);
    
        for (let i = beginning; i < end; i++) {
          toReturn.push(`${prependString}${i}`)
        }
    
        return toReturn;
      }
    
      return item;
    }).flat();
    
    console.log("Change 'DL3-7' to DL3, DL4 and so on: ")
    console.log(resolveRange);
    
    //this will get rid of duplicates
    const uniques = [...new Set(resolveRange)];
    console.log("Remove duplicates: ")
    console.log(uniques);

    【讨论】:

    • 嗨@cSharp,谢谢它适用于B1-5,但不适用于B1-B5,以防万一用户也指定!
    【解决方案2】:

    基本上,@cSharp 已经解释了将数据转换为所需输出的概念。

    1. 用逗号分隔。

    2. 使用正则表达式转换范围值并将其附加到数组中。 Regex pattern & test data

    3. 区分数组值。

    var a = [' DL1,C1,C5,C6','M4,DL3-7,B1-5'];
    
    var formatteds = a.reduce((previous, current) => {
        var splits = current.trim().split(',');
    
        var rangedSplits = splits.reduce((prev, cur) => {
            var pattern = new RegExp(/([A-Z]*)(\d)-[A-Z]*(\d)/);
            var match = pattern.exec(cur);
    
            if (match) {
                // Pattern 1: ['DL3-7', 'DL', '3', '7']
                // Pattern 2: ['DL3-DL7', 'DL', '3', '7']
    
                var startIndex = parseInt(match[2].toString());
                var endIndex = parseInt(match[3].toString());
                var arr = [];
    
                for (let i = startIndex; i <= endIndex; i++) {
                    arr.push(match[1].toString() + i);
                }
    
                prev = prev.concat(arr);
            } else {  
                prev = prev.concat([cur]);
            }
            
    
            return prev;
        }, []);
    
        previous = previous.concat(rangedSplits);
    
        return previous;
    }, []);
    
    var result = formatteds.filter((x, i, array) => array.indexOf(x) === i);
    
    console.log(result);

    【讨论】:

      【解决方案3】:

      创建一个具有该长度的数组,迭代和变换, 我刚刚写了最具挑战性的部分:

      function splitRange(range) {
        let a = range.split('-');
        if (a.length < 2) return [range];
        const baseString = (a[0].match(/[a-z A-Z]/g))?.join('');
        const baseNumber = +((a[0].match(/\d+/))?.shift());
        return Array.from({length: +a.pop() - baseNumber + 1}).map((_,i)=>`${baseString}${i+baseNumber}`);
      }
      
      const s='A23,C12-20,D12';
      
      console.log(
        s.split(',').map(item=>splitRange(item)).flat()
      );

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2016-06-18
        • 1970-01-01
        • 1970-01-01
        • 2023-03-27
        • 1970-01-01
        • 1970-01-01
        • 2017-04-23
        相关资源
        最近更新 更多