根据键中的子字符串将对象转换为对象数组



我有一个像这样的对象:

const object = {
User 1 Fecha de Nacimiento: "02/05/2000",
User 1 Porcentage: 25,
User 1 Primer Apellido: "Gonzalez",
User 1 Segundo Apellido: "Perez",
User 1 Sexo: "H",
User 1 nombre: "Manuel",
User 2 Fecha de Nacimiento: "02/05/2000",
User 2 Porcentage: 25,
User 2 Primer Apellido: "Diaz",
User 2 Segundo Apellido: "Rodriguez",
User 2 Sexo: "M",
User 2 nombre: "Pepa",
}

我想操作这个对象,使它在一个数组中转换,看起来像这样基于每个用户(即,1或2)的信息:

const arrayOfObjects = [
{
Fecha de Nacimiento: "02/05/2000",
Porcentage: 25,
Primer Apellido: "Gonzalez",
Segundo Apellido: "Perez",
Sexo: "H",
Nombre: "Manuel"
}, 
{
Fecha de Nacimiento: "02/05/2000",
Porcentage: 25,
Primer Apellido: "Diaz",
Segundo Apellido: "Rodriguez",
Sexo: "M",
Nombre: "Pepa" 
}
]; 

我需要一个辅助函数来做这件事,所以我可以把它存储在一个反应状态(函数组件)

const srcObject = {
"User 1 Fecha de Nacimiento": "02/05/2000",
"User 1 Porcentage": 25,
"User 1 Primer Apellido": "Gonzalez",
"User 1 Segundo Apellido": "Perez",
"User 1 Sexo": "H",
"User 1 nombre": "Manuel",
"User 2 Fecha de Nacimiento": "02/05/2000",
"User 2 Porcentage": 25,
"User 2 Primer Apellido": "Diaz",
"User 2 Segundo Apellido": "Rodriguez",
"User 2 Sexo": "M",
"User 2 nombre": "Pepa",
}

const transformData = (src) => {
const results = [];
Object.keys(src).forEach(key => {
const split = key.split(/^User (d+) /).filter(i => i !== '')
const index = +split[0] - 1
const newKey = split[1]
if (!results[+index]) {
results[+index] = {}
}
results[+index][newKey] = src[key]
})
return results
}


console.log(transformData(srcObject))

方法

  1. 通过拆分对象键来组织对象结构(因为顺序可能不同)
  2. 按通用密钥部分分组
  3. 收集到数组

var obj = {
"User 1 Fecha de Nacimiento": "02/05/2000",
"User 1 Porcentage": 25,
"User 1 Primer Apellido": "Gonzalez",
"User 1 Segundo Apellido": "Perez",
"User 1 Sexo": "H",
"User 1 nombre": "Manuel",
"User 2 Fecha de Nacimiento": "02/05/2000",
"User 2 Porcentage": 25,
"User 2 Primer Apellido": "Diaz",
"User 2 Segundo Apellido": "Rodriguez",
"User 2 Sexo": "M",
"User 2 nombre": "Pepa",
}

const getPrefixAndSuffix = (str = "", value) => {
//console.log("::", str)
var index = str.indexOf(' ', str.indexOf(' ') + 1);
var firstChunk = str.substr(0, index);
var secondChunk = str.substr(index + 1);

return {
prefix: firstChunk,
suffix: secondChunk,
value: value
}
}
function groupBy(list, keyGetter) {
const map = new Map()
list.forEach(item => {
const key = keyGetter(item)
const collection = map.get(key)
if (!collection) {
map.set(key, [item])
} else {
collection.push(item)
}
})
return map
}
const getAsList = (groups = {}) => {
const valuesArr = []
groups.forEach((value, key, map) => {
var resultObj = {}
value.forEach(value => {
resultObj[value.suffix] = value.value
})
valuesArr.push(resultObj)
});
return valuesArr
}
const getFormatted = (obj) => {
const asSplitList = Object.keys(obj).map((key) => {
return getPrefixAndSuffix(key, obj[key])
})
const groupedItems = groupBy(asSplitList, (it) => it.prefix)
return groupedItems
}

var format = getFormatted(obj)
const finalList = getAsList(format)
console.log(finalList)

const object = {
"User 1 Fecha de Nacimiento": "02/05/2000",
"User 1 Porcentage": 25,
"User 1 Primer Apellido": "Gonzalez",
"User 1 Segundo Apellido": "Perez",
"User 1 Sexo": "H",
"User 1 nombre": "Manuel",
"User 2 Fecha de Nacimiento": "02/05/2000",
"User 2 Porcentage": 25,
"User 2 Primer Apellido": "Diaz",
"User 2 Segundo Apellido": "Rodriguez",
"User 2 Sexo": "M",
"User 2 nombre": "Pepa",
}
var obj = {};
for (const [key, value] of Object.entries(object)) {

let splitedData = key.match(/Usersd/);
if (splitedData) {
let user = splitedData[0];
if (!obj[user])
obj[user] = {};
let prop = key.replace(/Usersd/i, '').trim();
obj[user][prop] = value;
}
}
let outPut = Object.values(obj);
console.log(outPut);

最新更新