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) ;
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)