如何从给定的字符串中清理?

时间:2018-08-20 14:46:54

标签: javascript arrays string loops

我有这样的数据。

var abc =",,,,,,,,,,,,,,,paul,2000,12sc21,logan,123,21sdf34,vfsarwe,456456,32fd23";
abc = abc.split(",");

let stub={};
        var results=[];
        var key=["name","value","acc"];
        var i=0;
        var j=0;

        for( var i = 0 ; i <abc.length - 1;i++){
           stub[key[j]=abc[i];
           j++
           if(j==3){
               results.push(stub);
               stub={};
               j=0;
    }
}
         abc = results;
  

我想让这些值以具有这三个键的对象数组的形式排列:

输出应为:

abc = [{"name": "paul", "value": "2000","acc":"12sc21"},{"name":"logan","value":"123","acc":"21sdf34"},{"name":"vfsarwe","value":"456456","acc":"32fd23"}];

,但无法获得所需的输出。仅当字符串开头没有,,,,时,才输出此输出。但是我得到的数据有时在说明中带有、、、、。

4 个答案:

答案 0 :(得分:1)

您可以使用abc.replace(/(^[,\s]+)/g, '')从字符串中删除前导逗号或空格。您的for循环运行的时间也不够长;它一直循环直到数组中只剩下一个元素然后停止。

更改

for(var i = 0 ; i < abc.length-1; i++) 

收件人

for(var i = 0 ; i < abc.length; i++)

var abc =",,,,,,,,,,,,,,,paul,2000,12sc21,logan,123,21sdf34,vfsarwe,456456,32fd23";
abc = abc.replace(/(^[,\s]+)|([,\s]+$)/g, '').split(",");

let stub={};
        var results=[];
        var key=["name","value","acc"];
        var i=0;
        var j=0;

        for(var i = 0 ; i < abc.length; i++){
           stub[key[j]]=abc[i];
           j++
           if(j==3){
               results.push(stub);
               stub={};
               j=0;
    }
}
abc = results;
console.log(abc);

答案 1 :(得分:1)

您可以使用.replace(/^\,+/, '')删除所有前导逗号,然后按逗号分割以获得array,然后使用array作为步骤遍历此3并构造您的结果:

var abc = ",,,,,,,,,,,,,,,paul,2000,12sc21,logan,123,21sdf34,vfsarwe,456456,32fd23";
var arr = abc.replace(/^\,+/, '').split(",");
var results = [];

for (var i = 0; i < arr.length; i = i + 3) {
  results.push({
    "name": arr[i],
    "value": arr[i + 1],
    "acc": arr[i + 2]
  });
}

演示:

var abc = ",,,,,,,,,,,,,,,paul,2000,12sc21,logan,123,21sdf34,vfsarwe,456456,32fd23";
var arr = abc.replace(/^\,+/, '').split(",");
var results = [];

for (var i = 0; i < arr.length; i = i + 3) {
  results.push({
    "name": arr[i],
    "value": arr[i + 1],
    "acc": arr[i + 2]
  });
}

console.log(results);

答案 2 :(得分:0)

您在,上拆分数据的方向正确。然后,您可以将数据分成3个块,然后将每个块映射到一个字典。

var data = ",,,,,,,,,,,,,,,paul,2000,12sc21,logan,123,21sdf34,vfsarwe,456456,32fd23";
var split = data.split(",");
var chunked = [];
while (split.length) {
    chunked.push(split.splice(0,3));
}
var res = chunked.map((i) => {
    if (!i[0] || !i[1] || !i[2]) {
        return null;
    }
    return {
      name: i[0],
      value: i[1],
      acc: i[2]
    };
}).filter((i) => i !== null);
console.log(res);

答案 3 :(得分:-1)

您可以使用:

abc.replace(/,+/g, ',').replace(/^,|,$/g, '').split(',');

regEx替换将在执行拆分之前删除您不感兴趣的数据。

abc.split(',').filter(Boolean);

实例化数组后,filter(Boolean)将从could be the equivalent of false的数组中删除项目。

编辑

var abc =",,,,,,,,,,,,,,,paul,2,000,12sc21,logan,123,21sdf34,vfsarwe,456456,32fd23";
var array = abc.replace(/,+/g, ',').replace(/^,|,$/g, '').split(/,([0-9,]+),/);
array = array.filter(Boolean).reduce(function(acc, item) {
    if (item.match(/^[0-9,]+$/)) {
      acc.push(item);
    } else {
      acc = acc.concat(item.split(','));
    }
    return acc;
}, []);