我定义了以下两个接口:
interface BarProp {
Item: Foo[];
Date: string;
}
interface Foo {
Name: string;
Date: string;
IsValid: boolean;
}
我正在尝试做两件事:
BarProp.Item
数组,但仅使用名称和日期属性IsValid
为true
我已经实现了以下内容,并且可以正常工作。但是我正在寻找更优雅的解决方案。
// 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,
}
});
答案 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
是最合乎逻辑的解决方案,从长远来看,使代码更易于维护。