首页 > 解决方案 > 克隆对象数组但具有选定的属性

问题描述

我定义了以下两个接口:

interface BarProp {
    Item: Foo[];
    Date: string;
}

interface Foo {
    Name: string;
    Date: string;
    IsValid: boolean;
}

我正在尝试做两件事:

我已经实现了以下内容并且它有效。但我正在寻找更优雅的解决方案。

// First create a new array by mapping over `Items` with only `Name` and `Date`
const newItemsArray = BarProp.Items.map((i) => {
    return {
        Name: i.Name,
        Date: i.Date,
    };
});

//loop over this new array and conditionally add `New Property`    
for (let i = 0; i < newItemsArray.length; i++) {
    if (BarProps.Items[i].IsValid) {
        newItemsArray[i].NewProperty = "New Property";
    }
}

谢谢!

编辑:

提议的改变:

const newItemsArray = BarProp.Items.map((i, index) => {
    if (i.IsValid) {
        Name: i.Name,
        Date: i.Date,
        NewProperty: "NewProperty",
    } else {
        Name: i.Name,
        Date: i.Date,
    }
});

标签: javascripttypescript

解决方案


不知道你为什么需要这个,这对我来说听起来不太合理,但你可以在一个循环中做到这一点。

您可以利用Object.assign单次创建新对象的优势,根据是否IsValid为真。

// First create a new array by mapping over `Items` with only `Name` and `Date`
const newItemsArray = BarProp.Items.map((i) => {
    return Object.assign({
        Name: i.Name,
        Date: i.Date
    }, i.IsValid ? {
        NewProperty: 'New Property'
    }: {});
});

再一次,这听起来不是一个很好的设计选择,但如果这是某种方式,某个地方,需要,它是一个可能的解决方案。当然,还有其他几种方法可以实现这一点,但Object.assign在我看来,这是最合乎逻辑的解决方案,从长远来看,使代码更易于维护。


推荐阅读