首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >将字符串拆分为基于第一和最后一次的数组

将字符串拆分为基于第一和最后一次的数组
EN

Stack Overflow用户
提问于 2022-06-10 06:41:41
回答 3查看 73关注 0票数 2

我有一个数组:-

变量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-7或者DL3-DL7DL3,DL4,DL5,DL6,DL7一样分裂

我之所以这样做,是因为我想阻止重复条目,就像DL3不应该出现在其他地方一样,我正在尝试循环来完成这个任务,只是想知道是否有更简单的方法来完成它,然后检查是否重复。

谢谢

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2022-06-10 07:38:32

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

代码语言:javascript
复制
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().match(/\d+/) - baseNumber + 1}).map((_,i)=>`${baseString}${i+baseNumber}`);
}

const s='DL1,C1,C5,C6,M4,DL3-7,B1-5';

console.log(
  s.split(',').map(item=>splitRange(item)).flat()
);

票数 0
EN

Stack Overflow用户

发布于 2022-06-10 07:09:30

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

  1. 将逗号分隔值获取到不同的数组项中。
  2. "DL3-7"解析为"DL3", "DL4"...
  3. 移除重复

一旦你解决了这个问题,一个接一个地处理它们就容易多了。代码是相当可读的,如果有什么事情很难理解,请告诉我。

代码语言:javascript
复制
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);

票数 3
EN

Stack Overflow用户

发布于 2022-06-10 07:44:32

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

  1. 用逗号分隔。
  2. 使用regex转换范围值并将其附加到数组中。Regex模式和测试数据
  3. 区分数组值。

代码语言:javascript
复制
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);

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/72570071

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档