如何合并具有不同属性的两个对象

时间:2016-10-03 10:30:04

标签: javascript ecmascript-6

我有这样的事情:

let user = [
{
    name: "step-one",
    values: {companyName: "Name", address: "company address"}
},
{
    name: "step-two",
    values: {name: "User", mobile: 0123}
},
{
    name: "step-three",
    values: [
              {file: "companyLogo", values: {active: true, fileName: "some name"}},
              {file: "avatar", values: {active: true, fileName: "file name"}}
            ]
}
]

我想只获取值并将它们放入一个新对象中。因此,像:

let wantedResult = {
    companyName: "Name",
    address: "company address",
    name: "User",
    mobile: 0123,
    files: [
            {file: "companyLogo", values: {active: false, fileName: "some name"}},
            {file: "avatar", values: {active: false, fileName: "file name"}}
        ]
};

我有什么建议吗?

3 个答案:

答案 0 :(得分:1)

你可以试试这个!

let user = [{
  name: "step-one",
  values: {
    companyName: "Name",
    address: "company address"
  }
}, {
  name: "step-two",
  values: {
    name: "User",
    mobile: 0123
  }
}, {
  name: "step-three",
  values: [{
    file: "companyLogo",
    values: {
      active: true,
      fileName: "some name"
    }
  }, {
    file: "avatar",
    values: {
      active: true,
      fileName: "file name"
    }
  }]
}]

var wantedResult = Object.assign({}, user[0].values, user[1].values, {files: user[2].values})
console.log(wantedResult)

答案 1 :(得分:0)

因为文件数组而有点hacky,但我会这样做:

var wantedResult = user.reduce((result, step) => {
    var values = Array.isArray(step.values) ? { files: step.values } : step.values;
    return Object.assign({}, result, values)
}, {});

当然,它只适用于您提供的那种结构。如果你有更多的对象在'值中有一个数组'财产,你需要重新考虑这种方法。

答案 2 :(得分:0)

第3步与其他人不一致。如果可能,请使其保持一致:values: files: [ { file1_data }, { file2_data } ]

修复不一致之后,您可以遍历每个步骤并将新属性添加到结果中。

let wantedResult = user.reduce(function(result, spec) {
  Object.keys(spec.values).forEach(function(key) {
     result[key] = spec.values[key];
  });
  return result;
}, {});

如果无法更改第3步,则可以减少干净:

let wantedResult = user.reduce(function(result, spec) {
  if (spec.name === "step-three") {
    result.files = spec.values;
  }
  else {
    Object.keys(spec.values).forEach(function(key) {
       result[key] = spec.values[key];
    });
  }
  return result;
}, {});