Как мы можем преобразовать вложенный массив внутри объекта в одно объединенное строковое значение, разделенное запятыми? - PullRequest
1 голос
/ 03 апреля 2020

У меня есть следующий образец массива:

mainArray = [
    {id: 15475, name: 'Ali', gender: 'Male', addresses: [
      {address1: 'Lebanon'}, 
      {address2: 'USA'}]
    },
    {id: 15475, name: 'Emily', gender: 'Female', addresses: [
      {address1: 'UK'}, 
      {address2: 'France'}]
    },
];

Мне нужно преобразовать его в нечто вроде:

mainArray = [
    {id: 15475, name: 'Ali', gender: 'Male', addresses: 'Lebanon, USA'},
    {id: 15475, name: 'Emily', gender: 'Female', addresses: 'UK, France }
];

В этом случае я добавил все вложенные массивы внутри элемента mainArray в одно строковое значение.

То, что я до сих пор делал, это то, что я извлек имена ключей mainArray:

extractedIndexes = ['id', 'name', 'gender', 'addresses'];

И сделал al oop, чтобы проверить тип каждого элемента внутри mainArray, и, если это объект, я объединю значения вложенного массива в одну строку:

for (const idx of this.extractedIndexes) {
  console.log(idx)
  this.mainArray.forEach((elem) => {
    let newItem = '';
    if (typeof (elem[idx]) == 'object') {
      elem[idx] = Object.keys(elem[idx]).forEach((key) => {
        console.log(elem[idx][key])
        // Add it to the field
      })
      console.log(elem[idx])
    }
  })
}
console.log(this.mainArray)

Эта строка console.log(elem[idx][key]) всегда возвращает следующее:

{address1: "Lebanon"}

{address2: "USA"}

{address1: "UK"}

{address2: "France"}

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

Я попытался сделать следующее:

if (typeof (elem[idx]) == 'object') {
  elem[idx] = elem[idx].toString().split(',')
  // Add it to the field
  console.log(elem[idx])
}

Но он вернул [Object, Object].

Так как я могу преобразовать вложенный массив в одно значение объединенной строки?

Вот stackblitz .

Ответы [ 3 ]

2 голосов
/ 03 апреля 2020

Просто используйте map и используйте Object.values для получения значений от объекта:

mainArray.map(({addresses, ...rest}) => ({...rest, addresses: 
    addresses.map(s => Object.values(s)).join(', ')}) );

Пример:

let mainArray = [
    {id: 15475, name: 'Ali', gender: 'Male', addresses: [
      {address1: 'Lebanon'},
      {address2: 'USA'}]
    },
    {id: 15475, name: 'Emily', gender: 'Female', addresses: [
      {address1: 'UK'},
      {address2: 'France'}]
    },
];

const result = mainArray.map(({addresses, ...rest}) => ({...rest, addresses: addresses.map(s => Object.values(s)).join(', ')}) );
console.log(result);

Если вы не знаете, является ли ключ массивом, вы можете попробовать использовать метод reduce:

const result = mainArray.reduce((a, c)=> {
  for (const key in c) {
      if (Array.isArray(c[key]))
        c[key] = c[key].map(s => Object.values(s)).join(', ');
  }
  a.push(c);
  return a;
},[])
console.log(result);

Пример:

let mainArray = [
    {id: 15475, name: 'Ali', gender: 'Male', addresses: [
      {address1: 'Lebanon'},
      {address2: 'USA'}]
    },
    {id: 15475, name: 'Emily', gender: 'Female', addresses: [
      {address1: 'UK'},
      {address2: 'France'}]
    },
];

const result = mainArray.reduce((a, c)=> {
  for (const key in c) {
      if (Array.isArray(c[key]))
        c[key] = c[key].map(s => Object.values(s)).join(', ');
  }
  a.push(c);
  return a;
},[])
console.log(result);
1 голос
/ 03 апреля 2020

Вы можете использовать рекурсивную функцию, чтобы получить адреса, которые будут работать с любой вложенной структурой, и получить значение, если ключ начинается с address и значение не является объектом.

const data =[{"id":15475,"name":"Ali","gender":"Male","addresses":[{"address1":"Lebanon"},{"address2":"USA"}]},{"id":15475,"name":"Emily","gender":"Female","addresses":[{"address1":"UK"},{"address2":"France"}]}]

const flat = (data, prev = '') => {
  let sep = prev ? ', ' : ''
  let result = '';

  for (let i in data) {
    if (typeof data[i] == 'object') {
      result += flat(data[i], prev + result)
    } else if (i.startsWith('address')) {
      result += sep + data[i]
    }
  }

  return result
}

const result = data.map(({
    addresses,
    ...rest
  }) =>
  ({ ...rest,
    addresses: flat(addresses)
  }))


console.log(result)
0 голосов
/ 03 апреля 2020
    {id: 15475, name: 'Ali', gender: 'Male', addresses: [
      {address1: 'Lebanon'}, 
      {address2: 'USA'}]
    },
    {id: 15475, name: 'Emily', gender: 'Female', addresses: [
      {address1: 'UK'}, 
      {address2: 'France'}]
    },
];<br>

function toString(arro) {
  return arro.reduce(
    (acc, rec) => {
      return [...acc, Object.values(rec)]
    }, []
  ).join(',')
}

const res = mainArray.map(
  it => {
    return Object.keys(it).reduce(
      (acc, item) => {
        if (typeof it[item] === 'object') {
          return {...acc, [item]: toString(it[item])}
        }
        return {...acc, [item]: it[item]}
      }, {}
    )
  }
)```
...