如何解决在JavaScript中转换对象
我需要转换该对象
{
person1_name: "John",person0_name: "Rob",person1_age: 36,person0_age: 45,total: 2,}
转换为这种格式
{
mAmbers: [
{
name: "Rob",age: 45,},{
name: "John",age: 36,],}
有人知道如何使用JavaScript而不用复杂的方式做到这一点吗?
解决方法
跟随是其中一种方式。
const x={
person1_name: 'John',person0_name: 'Rob',person1_age: 36,person0_age: 45,total: 2
}
const extractKey = keyName => obj => Object.keys(obj).filter(key => key.includes(keyName))
const names = extractKey('_name')(x);
const ages = extractKey('_age')(x);
const transform = (names,ages) => obj => ({ members: names.map((key,index) => ({name:obj[key],age: obj[ages[index]]})),total:names.length})
console.log(transform(names,ages)(x))
,
假设每个数字0、1,...总共有一个名称和年龄条目,您可以使用此名称:
let data = {
person1_name: "John",person0_name: "Rob",total: 2,};
let result = {members: [],total: data.total};
for (let i=0; i<data.total; i++) {
result.members.push({
name: data['person' + i + '_name'],age: data['person' + i + '_age'],});
}
console.log(result);
,
假设所有键的格式均为“ person {index} _ {name}”,即“ person0_name”,则可以采用正则表达式,例如:
var input = {
person1_name: "John",};
function transform(input) {
var output = {};
var members = {};
var keys = Object.keys(input);
for (var i = 0; i < keys.length; i++) {
var key = keys[i];
var match = key.match(/person(.*[^_])_(.*)/);
if (!match) {
output[key] = input[key];
continue;
}
var member = members[match[1]] || {};
member[match[2]] = input[key];
members[match[1]] = member;
}
output.members = Object.keys(members).map((k) => members[k]);
return output;
}
console.log(transform(input));
此功能不仅可以容纳“姓名”和“年龄”,因此,如果需要转换其他属性,则可以使用。
,不需要连续编号的解决方案:
var input = {
person1_name: "John",}
// match N from personN_name,using lookbehind and lookahead to match only the number
// use "optional chaining index" ?.[0] to extract the first match is found
const match = key => key.match(/(?<=^person)\d+(?=_name$)/)?.[0]
// "functional" approach
// extract keys from input,map them with the matching regexp and filter actual matches
var ids = Object.keys(input).map(k => match(k)).filter(Boolean)
// map ids to {name,age} objects
var members = ids.map(id => ({name:input[`person${id}_name`],age:input[`person${id}_age`]}))
// construct output
var output = {total:input.total,members}
console.log(output)
// "iterative" pproach
// initial value of outpit
var output = {total:input.total,members:[]}
for (var [k,v] of Object.entries(input)) { //for each key-value from input
var id = match(k) // try to get key
if (!id) continue // if id not found,continue to next kev-value pair
var name = v // the match is against personN_name,so v is the name
var age = input[`person${id}_age`] // get age
output.members.push({name,age}) // push new member
}
console.log(output)
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。