【问题标题】:Format Object Into Nested Fields将对象格式化为嵌套字段
【发布时间】:2019-07-14 17:43:09
【问题描述】:

我正在使用 for 循环遍历两个数组并生成一个对象。这行得通,但我需要格式稍有不同的最终对象。

首先,这是遍历数组并形成我的对象的代码:

differences:
   [ { kind: 'N', path: ['id_number'], rhs: '1' },
     { kind: 'N', path: ['person_firstname'], rhs: 'x1' },
     { kind: 'N', path: ['person_lastname'], rhs: 'x2' } ]

mappings: [ { lhs: 'name.first', rhs: 'person_firstname' },
  { lhs: 'name.last', rhs: 'person_lastname' },
  { lhs: 'name.middle', rhs: 'person_middlename' } ]

  let outResult = {};

  for (let diff of differences) {
    for (let mapping of mappings) {
      if (diff.path[0] === mapping.rhs) {
        p = mapping.lhs;
        v = diff.rhs;
        outResult[p] = v;
      }
    }
  }

这给了我一个看起来像这样的对象:

{ name.first: 'x1', name.last: 'x2' }

我需要适合我的模型的格式应该是这样的:

name: {
    first: "x1",
    last: "x2"
  }
};

我可以在此处使用哪些操作来按我需要的方式对其进行格式化?

【问题讨论】:

  • 请同时添加数据。
  • 你在寻找类似this的东西吗?
  • 看起来p 是一个包含name.first 的字符串。你不能用outResult[p.split('.')[1]] = v吗?还是有更多可能的.
  • 上面已经添加了数组数据。

标签: javascript object


【解决方案1】:

您可以获取所需属性的路径,将其拆分并将值分配给最新的对象。

//instead of 
outResult[p] = v;

// take
setValue(outResult, p, v);

function setValue(object, path, value) {
    var keys = path.split('.'),
        last = keys.pop();
        
    keys.reduce((o, k) => o[k] = o[k] || {}, object)[last] = value;
}


var differences = [{ kind: 'N', path: ['person_firstname'], rhs: '1' }, { kind: 'N', path: ['person_lastnam'], rhs: 'testing1' }, { kind: 'N', path: ['id_number'], rhs: 'tseting2' }],
    mappings = [{ lhs: 'name.first', rhs: 'person_firstname' }, { lhs: 'name.last', rhs: 'person_lastname' }, { lhs: 'name.middle', rhs: 'patient_middlename' }],
    outResult = {};

for (let diff of differences) {
    for (let mapping of mappings) {
        if (diff.path[0] === mapping.rhs) {
            setValue(outResult, mapping.lhs, diff.rhs);
        }
    }
}

console.log(outResult);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-12-26
    • 2023-01-07
    • 2012-01-28
    • 2019-03-28
    • 2018-02-02
    相关资源
    最近更新 更多