根据两个数组的内容创建对象

时间:2019-07-12 19:18:26

标签: javascript arrays object

我遇到一种情况,我需要通过组合来自两个数组的信息来格式化对象。我已经完成了第一部分,但是我不确定如何以所需的格式生成最终对象。

首先,我有一系列的文档更改,如下所示:

   [ { kind: 'E', path: ['short_name'], lhs: 'testing', rhs: 'testing1' },
     { kind: 'E', path: ['long_name'], lhs: 'testing', rhs: 'testing2' } ]

然后我有一系列映射,如下所示:

[ { lhs: 'legacyId', rhs: 'id_number' },
  { lhs: 'name.short', rhs: 'short_name' },
  { lhs: 'name.long', rhs: 'long_name' } ]

现在,我将值与正确的属性名称匹配,如下所示:

let p;
let v;
let combinedArray = [];

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

这有效,并为我提供了combinedArray

[ { p: 'short_name', v: 'testing1' },
  { p: 'payer_name', v: 'testing2' } ]

现在,我需要从该数组生成的对象看起来应该像这样:

{
  'short_name': 'testing1',
  'long_name': 'testing1'
}

如何从combinedArray的内容生成看起来像这样的对象?

1 个答案:

答案 0 :(得分:1)

您可以将属性直接添加到对象中。

您可以使用set并省略内部循环。

var differences = [{ kind: 'E', path: ['short_name'], lhs: 'testing', rhs: 'testing1' }, { kind: 'E', path: ['long_name'], lhs: 'testing', rhs: 'testing2' }]
    mappings = [{ lhs: 'legacyId', rhs: 'id_number' }, { lhs: 'name.short', rhs: 'short_name' }, { lhs: 'name.long', rhs: 'long_name' }];
    rhs = new Set(mappings.map(({ rhs }) => rhs)),
    result = {};

for (let diff of differences) {
    if (rhs.has(diff.path[0])) {
        result[diff.path[0]] = diff.rhs;
    }
}

console.log(result);