У меня есть такие данные.

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;

Я хотел бы получить эти значения расположены в виде массива объектов, имеющих эти 3 ключа:

Вывод должен быть:

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

Но не в состоянии получить желаемый результат. этот вывод происходит только тогда, когда строка не имеет ,,,,,, в начале. Но данные, которые я получаю, иногда приводят ,,,,, в заявлении.

-3
shalabh 20 Авг 2018 в 17:46

4 ответа

Лучший ответ

Ты можешь использовать:

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

RegEx заменяет удаляющие данные, которые вам не интересны, перед выполнением разделения.

Или

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

Фильтр (Boolean) удалит элементы из массива, которые может быть эквивалентом 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;
}, []);
-1
jcubic 20 Авг 2018 в 15:43

Вы можете использовать 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
hev1 20 Авг 2018 в 14:53

Вы на правильном пути, разделив свои данные на ,. Затем вы можете разбить данные на куски по 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);
0
Jim Wright 20 Авг 2018 в 15:06

Вы можете использовать .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);
1
cнŝdk 20 Авг 2018 в 14:59
51933288