简体   繁体   中英

Typescript: Is there a simple way to convert an array of objects of one type to another

So, I have two classes

Item { name: string; desc: string; meta: string}

ViewItem { name: string; desc: string; hidden: boolean; }

I have an array of Item that needs to be converted into an array of ViewItem. Currently, I am looping through the array using for, instantiating ViewItem, assigning values to attributes and pushing it to the second array.

Is there a simple way to achieve this using lambda expressions? (similar to C#) Or is there any other means?

You haven't showed enough of your code, so I'm not sure how you instantiate your classes, but in any case you can use the array map function :

class Item {
    name: string;
    desc: string;
    meta: string
}

class ViewItem {
    name: string;
    desc: string;
    hidden: boolean;

    constructor(item: Item) {
        this.name = item.name;
        this.desc = item.desc;
        this.hidden = false;
    }
}

let arr1: Item[];
let arr2 = arr1.map(item => new ViewItem(item));

( code in playground )


Edit

This can be shorter with Object.assign :

constructor(item: Item) {
    Object.assign(this, item);
}

An alternate method is to use Object.keys ,

class Item {
    name: string;
    desc: string;
    meta: string
}

class ViewItem {
    name: string;
    desc: string;
    hidden: boolean;

    // additional properties
    additionalProp: boolean;

    constructor(item: Item) {
        Object.keys(item).forEach((prop) => { this[prop] = item[prop]; });

        // additional properties specific to this class
        this.additionalProp = false;
    }
}

Usage:

let arr1: Item[] = [
    {
        name: "John Doe",
        desc: "blah",
        meta: "blah blah"
    }
];
let arr2: ViewItem[] = arr1.map(item => new ViewItem(item));

Playground link

you can do use something like this.

const newdata = olddata.map((x) => {
        return { id: Number(x.id), label: x.label };
      });

as the converted column will be mapped to the newdata array.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM