微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

在JavaScript中转换对象

如何解决在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 举报,一经查实,本站将立刻删除。