【问题标题】:Converting object in JavaScript在 JavaScript 中转换对象
【发布时间】:2020-09-02 10:23:44
【问题描述】:

我需要转换这个对象

{
  person1_name: "John",
  person0_name: "Rob",
  person1_age: 36,
  person0_age: 45,
  total: 2,
}

变成这种格式

{
    mambers: [
      {
        name: "Rob",
        age: 45,
      },
      {
        name: "John",
        age: 36,
      },
    ],
    total: 2,
  }

有谁知道如何使用 JavaScript 以不复杂的方式做到这一点?

【问题讨论】:

标签: javascript object


【解决方案1】:

以下是其中一种方式。

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))

【讨论】:

  • 非常感谢您的帮助!
【解决方案2】:

假设每个 0, 1, ... total-1 都存在一个名称和年龄条目,您可以使用这个:

let data = {
  person1_name: "John",
  person0_name: "Rob",
  person1_age: 36,
  person0_age: 45,
  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);

【讨论】:

  • 非常感谢您的帮助!
【解决方案3】:

假设所有键的格式为“person{index}_{name}”,即“person0_name”,则可以采用正则表达式,如下所示:

var input = {
    person1_name: "John",
    person0_name: "Rob",
    person1_age: 36,
    person0_age: 45,
    total: 2,
};

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));

此函数不仅可以容纳“姓名”和“年龄”,因此如果需要转换其他属性,这将起作用。

【讨论】:

  • 非常感谢您的帮助!
  • @dariusz 没问题,如果这些解决方案中的任何一个是正确/最有益的,请您将其标记为已回答:)
【解决方案4】:

不需要连续编号的解决方案:

var input = {
    person1_name: "John",
    person0_name: "Rob",
    person1_age: 36,
    person0_age: 45,
    total: 2,
}

// 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)

【讨论】:

  • 非常感谢您的帮助!
猜你喜欢
  • 2019-04-06
  • 1970-01-01
  • 2014-09-13
  • 1970-01-01
  • 2016-11-25
  • 1970-01-01
  • 2022-01-10
  • 1970-01-01
  • 2015-08-09
相关资源
最近更新 更多