javascript - 克隆对象数组但具有选定的属性
问题描述
我定义了以下两个接口:
interface BarProp {
Item: Foo[];
Date: string;
}
interface Foo {
Name: string;
Date: string;
IsValid: boolean;
}
我正在尝试做两件事:
- 克隆
BarProp.Item
数组,但仅具有属性名称和日期 - 在这个克隆的数组中,添加一个新属性 if
IsValid
istrue
我已经实现了以下内容并且它有效。但我正在寻找更优雅的解决方案。
// 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,
}
});
解决方案
不知道你为什么需要这个,这对我来说听起来不太合理,但你可以在一个循环中做到这一点。
您可以利用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
在我看来,这是最合乎逻辑的解决方案,从长远来看,使代码更易于维护。
推荐阅读
- jquery - jQuery offset() 缩放后返回相同的最大值?
- react-native - 我安装了 react-native-barcode-builder 并得到一个空白矩形
- kotlin - 为什么无法访问的语句方法不会导致编译错误?
- docker - 如何从 Concourse CI 中的 git 资源构建 docker-compose 容器?
- python - Tkinter 在终端中工作但不在 sublime 中(mac)
- java - Android 上的 AnyChart 着色网格
- php - 如何在已由 mysql 填充的下拉列表中设置值
- c# - VSIX:从 VS2017 移植到 VS2019 的步骤
- python - 如何从特定文件夹中的 Outlook 中的不同帐户读取 Outlook 电子邮件?
- php - Laravel 注册页面未加载