Home > other >  typescript - create object from values in array
typescript - create object from values in array

Time:07-01

let's say I have a model definition like this.

export interface Basicdata {
    materialnumber: number;
    type: string;
    materialclass: string;
}

I furthermore have an array with values, which match exactly the order of the Basicdata model, i.e.

["10003084", "S", "CLIP"]

I am searching for a way to create the object from these values in the array. What I did is creating an empty object and assigning the array values.

const singleRow = rows[0];

const newBD: Basicdata = {
 materialnumber: 0,
 type: '',
 materialclass: '',  
}


newBD.materialnumber = singleRow[0];
newBD.type = singleRow[1];
newBD.materialclass = singleRow[2];

But surely there is a better, more elegant way to do that, no? I looked into map and reduce but could find a way.

Thank you.

CodePudding user response:

As others have mentioned, use a class so that you can use the spread operator (technically you could create a function that returns an objects that meets the interface Basicdata, but you should use a class)

class Basicdata {
  materialnumber: number;
  type: string;
  materialclass: string;

  constructor(materialnumber: string | number, type: string, materialclass: string, ...rest: any) {
    this.materialnumber = typeof materialnumber === "number" ? materialnumber : parseInt(materialnumber);
    this.type = type;
    this.materialclass = materialclass;
  }
}

const rows: [string, string, string][] = [
  ["10003084", "S", "CLIP"],
  ["4324324", "B", "FOUR"],
  ["4444432", "C", "CORN"],
];

const singleRow = rows[0];

const newBD = new Basicdata(...singleRow) ;

Playground link

CodePudding user response:

The issue with the following solution is that it relies on the order of the object properties being consistent. Is this about what you're looking for?

const singleRow = [1, "2", "3"];

const newBD: Basicdata = {
    materialnumber: 0,
    type: "",
    materialclass: "",
};

Object.keys(newBD).map((key, index) => {
    newBD[key] = singleRow[index]
});

If not, you could make a class as others have said, or you can make a helper function likes this, if it would help with your use case.

const addProps = (arr) => {
    const newObj = {
        materialnumber: arr[0],
        type: arr[1],
        materialclass: arr[2],
    };

    return newObj
};

addProps(singleRow)
  • Related