Зацикливание и преобразование строкового значения объекта в объект, если значение имеет запятую - PullRequest
0 голосов
/ 20 мая 2019

У меня есть объект:

{x: '1', y: '1,2,3'}

Я хочу пройти через него и преобразовать строку в объект, если он содержит запятую.

Ожидаемый результат должен быть:

{x: 1, y: {0: 1, 1: 2, 2: 3}}

Я пытался использовать Object.entries и map как. ниже, но я получаю неопределенный результат для всего.

Object.entries(oResult).map(el => {
  if(el[1].includes(',')) {
    const aEl = el[1].split(',');
    el[1] = Object.assign({}, aEl);
  }
})

Ответы [ 4 ]

1 голос
/ 20 мая 2019

Мы можем использовать Object.fromEntries и Object.fromEntries для простого преобразования объектов -

const transform = (o = {}) =>
  Object.fromEntries(Object.entries(o).map(([k,v]) =>
    [ k
    , v.includes(',')
        ? Object.fromEntries(v.split(',').map((x, i) => [ i, x ]))
        : v
    ]
  ))

console.log(transform({ x: '1', y: '1,2,3' }))
// { x: 1, y: { 0: '1', 1: '2', 2: '3' } }

console.log(transform({ a: 'apple,pear,cherry', b: 'foo,bar' }))
// { a: { 0: 'apple', 1: 'pear', 2: 'cherry' }, b: { 0: 'foo', 1: 'bar' } }
1 голос
/ 20 мая 2019

Вы можете сделать что-то вроде этого:

let obj = {x: '1', y: '1,2,3'},
    strToObj = str => str.split(',').reduce((r,c,i) => (r[i] = c, r), {})

let result = Object.entries(obj)
  .reduce((r,[k,v]) => (r[k] = v.includes(',') ? strToObj(v) : v, r), {})

console.log(result)

Идея состоит в том, чтобы использовать Array.reduce для преобразования строки в объект, сначала разбив ее на , (это то, что делает функция strToObj). Затем, используя Object.entries , вы просто получаете ключ / значение и составляете ваш конечный объект.

Вы также можете сделать это как функцию:

let strToObj = str => str.split(',').reduce((r,c,i) => (r[i] = c, r), {})

let convertObject = obj => Object.entries(obj).reduce((r,[k,v]) => 
    (r[k] = v.length < 2 ? v : strToObj(v), r), {})
	
console.log(convertObject({x: '1', y: '1,2,3'}))
console.log(convertObject({x: 'A,BC,D', y: 'D,DD,DDD'}))
1 голос
/ 20 мая 2019

const yourObject = {x: '1234,1235,1236', y: '1,2,3'};
const res = {};

for (let [key, val] of Object.entries(yourObject)) {
  let split = val.split(',').map(s => parseInt(s));
  split.length > 1 ? res[key] = { ...split
  } : res[key] = split[0];
}

console.log(res)
1 голос
/ 20 мая 2019

Я думаю, это то, что вы ищете:

const data = {x: '1', y: '1,2,3', z: '4,5,6'};

function transform( object ) {
  let index = 0;

  for ( const key in object ) {
    if ( object[ key ].includes( "," ) ) {
      const splitValues = object[ key ].split( "," ) // get object values into array

      object[ key ] = {}; // create an empty object to add the key/value pairs to
      for ( const value of splitValues ) {
        object[ key ][ index ] = value;
        index++
      }

      index = 0; // reset index for next iteration
    }
  }

  return object;
}

console.log( transform( data ) );
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...