Как разделить элементы массива JavaScript, если свойство объекта имеет определенный разделитель - PullRequest
0 голосов
/ 15 мая 2018

У меня есть массив объектов, и у некоторых объектов есть свойство с запятыми.Что я хочу сделать, так это если у этого объекта есть свойство с запятыми, я хочу разделить его на новый объект и рекурсивно скопировать все остальные свойства в новый элемент массива.

Пример: мне нужночтобы преобразовать этот массив объектов:

[ { 
    prop1: ' text1 , text2 , text3 ',
    prop2: 'stuff1',
    prop3: 'stuff1',
    prop4: 'stuff1',
    prop5: 'https://www.stuff1.com' },

  { 
    prop1: ' text1 , text2 , text3 ',
    prop2: 'stuff2',
    prop3: 'stuff2',
    prop4: 'stuff2',
    prop5: 'https://www.awefewfew.com' },

 ]

в это:

[ { 
    prop1: 'text1',
    prop2: 'stuff1',
    prop3: 'stuff1',
    prop4: 'stuff1',
    prop5: 'https://www.stuff1.com' },

    { 
    prop1: 'text2',
    prop2: 'stuff1',
    prop3: 'stuff1',
    prop4: 'stuff1',
    prop5: 'https://www.stuff1.com' },

    { 
    prop1: 'text3 ',
    prop2: 'stuff1',
    prop3: 'stuff1',
    prop4: 'stuff1',
    prop5: 'https://www.stuff1.com' },   

  { 
    prop1: 'text1',
    prop2: 'stuff2',
    prop3: 'stuff2',
    prop4: 'stuff2',
    prop5: 'https://www.awefewfew.com' },

      { 
    prop1: 'text2',
    prop2: 'stuff2',
    prop3: 'stuff2',
    prop4: 'stuff2',
    prop5: 'https://www.awefewfew.com' },

      { 
    prop1: 'text3',
    prop2: 'stuff2',
    prop3: 'stuff2',
    prop4: 'stuff2',
    prop5: 'https://www.awefewfew.com' },  
 ]

Разделив в prop1, затем рекурсивно скопировав все остальные свойства в новый элемент массива.

edit: я смог выяснить это на самом деле в листах Google, но не смог перенести это на vanilla JS:

function splitColumnAndRepeatRows(anArray, splitColumnIndex) {
  var output = [];
  for (i in anArray){ 
    var splitArray = anArray[i][splitColumnIndex].split(","); 
    for (j in splitArray){ 
      var row = anArray[i].slice(0); 
      row[splitColumnIndex] = alltrim(splitArray[j]); 
      output.push(row); 
    }
  }
  return output;
}

function alltrim(str) {
  return str.replace(/^\s+|\s+$/g, '');
}

Ответы [ 4 ]

0 голосов
/ 15 мая 2018

Попробуйте это:

var jsonObj = [{ 
    prop1: ' text1 , text2 , text3 ',
    prop2: 'stuff1',
    prop3: 'stuff1',
    prop4: 'stuff1',
    prop5: 'https://www.stuff1.com' },
  { 
    prop1: ' text1 , text2 , text3 ',
    prop2: 'stuff2',
    prop3: 'stuff2',
    prop4: 'stuff2',
    prop5: 'https://www.awefewfew.com' }];
    
 var newArr = [];   
 
 for (var i in jsonObj) {
   var splitString = jsonObj[i].prop1.split(',');
   
   splitString.map(item => {
     newArr.push({
       "prop1": item,
       "prop2": jsonObj[i].prop2,
       "prop3": jsonObj[i].prop3,
       "prop4": jsonObj[i].prop4,
       "prop5": jsonObj[i].prop5
     });
   });
 }
 
 console.log(newArr);
0 голосов
/ 15 мая 2018

используйте reduce и split и forEach

let data = [
  {
    prop1: ' text1 , text2 , text3 ',
    prop2: 'stuff1',
    prop3: 'stuff1',
    prop4: 'stuff1',
    prop5: 'https://www.stuff1.com'
  },

  {
    prop1: ' text1 , text2 , text3 ',
    prop2: 'stuff2',
    prop3: 'stuff2',
    prop4: 'stuff2',
    prop5: 'https://www.awefewfew.com'
  }
]
let res = data.reduce((re, obj) => {
  obj.prop1.split(',').forEach(val => {
    re.push(Object.assign({}, obj, { prop1: val.trim() }))
  })
  return re
}, [])
console.log(res)
0 голосов
/ 15 мая 2018

Мне нравится краткость array.concat в сочетании с reduce() и map() для этого, но, очевидно, есть много способов сделать это.Не ясно, что в ваших prop1 строках всегда будут пробелы, поэтому для их удаления используется небольшое регулярное выражение.

let arr = [ { prop1: ' text1 , text2 , text3 ',prop2: 'stuff1',prop3: 'stuff1',prop4: 'stuff1',prop5: 'https://www.stuff1.com' },{ prop1: ' text1 , text2 , text3 ',prop2: 'stuff2',prop3: 'stuff2',prop4: 'stuff2',prop5: 'https://www.awefewfew.com' },]

let final = arr.reduce((a, {prop1, ...obj}) => a.concat(
        prop1.trim()
        .split(/\s*,\s*/)
        .map(prop => ({prop1: prop, ...obj}))
    ), [])

console.log(final)
0 голосов
/ 15 мая 2018

Используйте .reduce для перебора входных данных, разделите prop1 на ,, а затем добавьте каждый в выходной массив:

const input=[{prop1:' text1 , text2 , text3 ',prop2:'stuff1',prop3:'stuff1',prop4:'stuff1',prop5:'https://www.stuff1.com'},{prop1:' text1 , text2 , text3 ',prop2:'stuff2',prop3:'stuff2',prop4:'stuff2',prop5:'https://www.awefewfew.com'},]
const ouput = input.reduce((accum, { prop1, ...rest }) => {
  const prop1s = prop1.trim().split(' , ');
  prop1s.forEach(prop1 => accum.push({
    prop1,
    ...rest
  }));
  return accum;
}, []);
console.log(ouput);
...