форматировать данные, используя .map и .filter - PullRequest
0 голосов
/ 05 июля 2019

я получил следующий тип результата из базы данных при получении базы данных.Я перепробовал много вещей и нашел Google, но ничего не смог найти.Пожалуйста, помогите мне с этим.спасибо.

{ metaData:
   [ { name: 'ID' },
     { name: 'NAME' },
     { name: 'LED_ID' },
     { name: 'LED_ORG_ID' },
     { name: 'COMPANY_ADD' },
     { name: 'STATE_CODE' },
     { name: 'CIN_NO' } ],
  rows:
   [ [ 1,
       'company name',
       2481,
       '161',
       'address ',
       '27',
       'number' ],
     [ 2,
       'company name2',
       2581,
       '164',
       'address 2',
       '27',
       'number2' ]
}
}

Я пытаюсь достичь ниже форматированных данных

{
 data:[
 {
  ID:1,
  NAME:'company name',
  LED_ID:2481,
  LED_ORG_ID: '161',
  COMPANY_ADD:'address',
  STATE_CODE:'27',
  CIN_NO:'number'
},
 {
  ID:2,
  NAME:'company name 2',
  LED_ID:2581,
  LED_ORG_ID: '164',
  COMPANY_ADD:'address 2',
  STATE_CODE:'27',
  CIN_NO:'number 2'
}
]
}

Ответы [ 4 ]

2 голосов
/ 05 июля 2019

Используйте map в сочетании с flatMap и reduce:

const metaData = [{name:'ID'},{name:'NAME'},{name:'LED_ID'},{name:'LED_ORG_ID'},{name:'COMPANY_ADD'},{name:'STATE_CODE'},{name:'CIN_NO'}];
const rows = [[1,'company name',2481,'161','address ','27','number'],[2,'company name2',2581,'164','address 2','27','number2']];

const res = rows.flatMap(e => e.map((f, i) => ({ [metaData[i].name]: f })).reduce((a, c) => ({ ...a, ...c }), {}));

console.log(res);

Более эффективное решение благодаря Марку Мейеру:

const res = rows.map(e => e.reduce((a, c, i) => ({ ...a, ...{ [metaData[i].name]: c }}), {});
2 голосов
/ 05 июля 2019

Сначала вы можете получить ключи, а затем сопоставить объект с записями.

var data = { metaData: [{ name: 'ID' }, { name: 'NAME' }, { name: 'LED_ID' }, { name: 'LED_ORG_ID' }, { name: 'COMPANY_ADD' }, { name: 'STATE_CODE' }, { name: 'CIN_NO' }], rows: [[1, 'company name', 2481, '161', 'address ', '27', 'number'], [2, 'company name2', 2581, '164', 'address 2', '27', 'number2']] },
    keys = data.metaData.map(({ name }) => name),
    result = { data: data.rows.map(a => Object.fromEntries(keys.map((k, i) => [k, a[i]]))) };

console.log(result);
.as-console-wrapper { max-height: 100% !important; top: 0; }
2 голосов
/ 05 июля 2019

Вы можете использовать array.map() и Object.fromEntires():

let data = { metaData:
   [ { name: 'ID' },
     { name: 'NAME' },
     { name: 'LED_ID' },
     { name: 'LED_ORG_ID' },
     { name: 'COMPANY_ADD' },
     { name: 'STATE_CODE' },
     { name: 'CIN_NO' } ],
  rows:
   [ [ 1,
       'company name',
       2481,
       '161',
       'address ',
       '27',
       'number' ],
     [ 2,
       'company name2',
       2581,
       '164',
       'address 2',
       '27',
       'number2' ]
   ]
}

let result = data.rows.map(
        entry => Object.fromEntries(
            entry.map((x, i) => [data.metaData[i].name, x])
        )
    )

console.log(result)

РЕДАКТИРОВАТЬ: Внешний map преобразует rows, поэтому будут возвращены два объекта.Внутренний преобразовывает все значения в формат, подобный ["ID", 1].Этот массив массивов передается в качестве аргумента в Object.fromEntries, который создает новый объект на основе этих пар.

1 голос
/ 05 июля 2019

let data = {
  metaData: [{
      name: 'ID'
    },
    {
      name: 'NAME'
    },
    {
      name: 'LED_ID'
    },
    {
      name: 'LED_ORG_ID'
    },
    {
      name: 'COMPANY_ADD'
    },
    {
      name: 'STATE_CODE'
    },
    {
      name: 'CIN_NO'
    }
  ],
  rows: [
    [1,
      'company name',
      2481,
      '161',
      'address ',
      '27',
      'number'
    ],
    [2,
      'company name2',
      2581,
      '164',
      'address 2',
      '27',
      'number2'
    ]
  ]
}

let transform = (meta, item) => {
  return meta.map((a, i) => ({
    [a.name]: item[i]
  }))
}

let result = data.rows.map(i => transform(data.metaData, i))

console.log(result.map(i => Object.assign({}, ...i)))

Может быть и лучше ...

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