2017-07-04 45 views
0

我在我的角度应用中的以下接口:返回数组不给定对象

interface Reservation { 
    id: string; 
    from: Date; 
    to: Date; 
} 

interface Bedroom { 
    id: string; 
    reservations: Array <Reservation> ; 
} 

interface House { 
    id: string; 
    bedrooms: Array <Bedroom>; 
} 

在某些时候,我从HouseArray在S一定Bedroom内删除从Reservation并返回整个的副本HouseArray只有没有删除Reservation项目。

我不能改变现有的ArrayHouse s。我应该怎么做?

+0

这个问题似乎是不言自明的。进行深层复制,遍历它并删除属性。这种方法你有问题吗?你尝试了什么? – estus

+0

所以我实际上想避免迭代每个项目的性能原因。我想知道我可以使用'JSON.parse(JSON.stringify(房屋))'然后实际上去“采摘?”保留对象从结果对象中返回。 – Sammy

+0

'JSON.parse(JSON.stringify ...'几乎不会对性能有好处,在深度复制实现中您不会看到它,您可以深度复制并从中删除属性,或者可以省略属性手工复制数组并检查是否可以比_,cloneDeep等现有解决方案更好地进行深度复制。无法避免迭代,因为数组处理无法迭代完成, – estus

回答

0

你应该用你的阵列上splice方法,combinet与对象(即由underscore.js提供)的克隆: https://www.w3schools.com/jsref/jsref_splice.asp http://underscorejs.org/#clone

这将是东西(我没有检查代码)像这个:

import * as _ from 'underscore'; 
removeReservation(bedroom: Bedroom, reservation: Reservation): Bedroom { 
    let position = bedroom.reservations.findIndex(checkingRes => { 
     return checkingRes.id == reservation.id 
    }); 
    let bedroomCopy = _.clone(bedroom); 
    bedroomCopy.reservations.splice(position, position + 1); 
    return bedroomCopy; 
} 

如果你想逐根删除保留,你只需要忽略克隆操作。

removeReservation(bedroom: Bedroom, reservation: Reservation): Bedroom { 
    let position = bedroom.reservations.findIndex(checkingRes => { 
     return checkingRes.id == reservation.id 
    }); 
    bedroom.reservations.splice(position, position + 1); 
    return bedroom; 
} 
+1

拼接具有破坏性,是不是? – estus

+0

您是什么意思通过破坏性?它只是从数组中删除对象。我想这就是问题的情况;) –

+1

问题是'我不能改变现有的房屋阵列'。 – estus