克隆对象数组但具有选定的属性

时间:2019-05-02 12:28:49

标签: javascript typescript

我定义了以下两个接口:

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

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

我正在尝试做两件事:

  • 克隆BarProp.Item数组,但仅使用名称和日期属性
  • 在此克隆数组中,如果IsValidtrue
  • ,请添加一个新属性。

我已经实现了以下内容,并且可以正常工作。但是我正在寻找更优雅的解决方案。

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

1 个答案:

答案 0 :(得分:2)

不确定为什么需要此功能,这对我来说听起来不是很合理,但是您可以在一个循环中完成它。

您可以根据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是最合乎逻辑的解决方案,从长远来看,使代码更易于维护。