Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/gwt/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 克隆具有选定属性的对象数组_Javascript_Typescript - Fatal编程技术网

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

Javascript 克隆具有选定属性的对象数组,javascript,typescript,Javascript,Typescript,我定义了以下两个接口: interface BarProp { Item: Foo[]; Date: string; } interface Foo { Name: string; Date: string; IsValid: boolean; } 我试着做两件事: 克隆BarProp.Item数组,但仅使用属性名称和日期 在此克隆数组中,如果IsValid为true 我已经实现了以下功能,并且可以正常工作。但我正在寻找一个更优雅的解决方案 //

我定义了以下两个接口:

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";
    }
}

不知道你为什么需要这个,我觉得这听起来不太合理,但你可以在一个循环中完成

您可以利用
对象。根据
是否有效
是否为真,分配
在单个快照中创建新对象

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

我不知道你为什么需要这个,我觉得这听起来不太合理,但你可以在一个循环中完成

您可以利用
对象。根据
是否有效
是否为真,分配
在单个快照中创建新对象

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

您不需要迭代两次,可以使用索引直接在映射循环中分配属性。
props
是您需要检查的数组吗?@briosheje注意,如果IsValid为true,我只想要
NewProperty
。我已经用一个提议的改变更新了原来的帖子。请看一看。请提供关于什么是
props.Items
的更多信息。它是一个不同的数组吗?它只是一个打字错误,是不是意味着
BarProp.Items
?尽管语法错误,但提议的变更逻辑是正确的。这是学校作业吗?也许可以考虑使用lambda将项集合迭代到对象类型的新实例..哎呀,输入错误。它与
BarProps.Items
相同。您不需要迭代两次,可以使用索引直接在映射循环中分配属性。
props
是您需要检查的数组吗?@briosheje注意,如果IsValid为true,我只想要
NewProperty
。我已经用一个提议的改变更新了原来的帖子。请看一看。请提供关于什么是
props.Items
的更多信息。它是一个不同的数组吗?它只是一个打字错误,是不是意味着
BarProp.Items
?尽管语法错误,但提议的变更逻辑是正确的。这是学校作业吗?也许可以考虑使用lambda将项集合迭代到对象类型的新实例..哎呀,输入错误。它与BarProps.Items相同。它是我工作项目的一部分。“我在这里把它归结为它的本质。”ZeroDarkThirty很好,不过,也许显示原始问题会导致其他可能的解决方案。这里我能猜到的最好的情况是它可以在一个循环中完成,但不确定“扩展”目标是否会使这段代码变得无用;)。它是使用第三方组件的react应用程序的一部分。我需要先创建这个
newItemsArray
,然后再将它作为道具传递给这个组件。我只是想知道,为什么我需要进行对象分配?映射和返回新对象还不够吗?@ZeroDarkThirty您不“需要”它,我只是决定使用它,因为它很容易连接对象,因为
对象.assign
构造函数接受无限对象作为参数,返回单个合并对象。您还可以创建单个对象,检查IsValid是否为true,分配新属性并返回新对象,但语法将更长。通过这种方式,您可以在单行中使用三元运算符和Object.assign.It作为我正在处理的项目的一部分。“我在这里把它归结为它的本质。”ZeroDarkThirty很好,不过,也许显示原始问题会导致其他可能的解决方案。这里我能猜到的最好的情况是它可以在一个循环中完成,但不确定“扩展”目标是否会使这段代码变得无用;)。它是使用第三方组件的react应用程序的一部分。我需要先创建这个
newItemsArray
,然后再将它作为道具传递给这个组件。我只是想知道,为什么我需要进行对象分配?映射和返回新对象还不够吗?@ZeroDarkThirty您不“需要”它,我只是决定使用它,因为它很容易连接对象,因为
对象.assign
构造函数接受无限对象作为参数,返回单个合并对象。您还可以创建单个对象,检查IsValid是否为true,分配新属性并返回新对象,但语法将更长。通过这种方式,您可以使用三元运算符和Object.assign在单行中完成此操作。