Boky
Boky

Reputation: 12064

How to merge two object with different properties

I have something like this :

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"}}
            ]
}
]

I want to get only values and put them into a new object. Thus, something like :

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"}}
        ]
};

Any advice how I can do that?

Upvotes: 0

Views: 99

Answers (3)

clinton3141
clinton3141

Reputation: 4841

Step 3 is inconsistent with the others. If possible, make it consistent to have: values: files: [ { file1_data }, { file2_data } ].

After fixing the inconsistency, you can iterate through each of the steps and add the new properties to the result.

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

If not possible to change step 3, you can make it a bit less clean:

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;
}, {});

Upvotes: 0

Gleb Kostyunin
Gleb Kostyunin

Reputation: 3863

It is a bit hacky because of the files array, but i would do it like that:

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

Of course it'll work only for that kind of structure you provided. If you have more objects that have an array in the 'values' property, you'll need to rethink the approach.

Upvotes: 0

Pranesh Ravi
Pranesh Ravi

Reputation: 19113

You can try this!

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)

Upvotes: 1

Related Questions