【问题标题】:Returning array without given object返回没有给定对象的数组
【发布时间】:2017-07-04 18:25:50
【问题描述】:

我的 Angular 应用中有以下接口:

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

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

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

在某些时候,我必须从 Houses 的 Array 中的某个 Bedroom 中删除 Reservation,并返回整个 House Array 的副本Reservation项目。

我无法改变现有的 ArrayHouses。我该怎么做?

【问题讨论】:

  • 这个问题似乎是不言自明的。制作一个深拷贝,对其进行迭代并删除属性。您对这种方法有疑问吗?你尝试了什么?
  • 因此,出于性能原因,我实际上想避免迭代每个项目。我想知道我可以使用JSON.parse(JSON.stringify(houses)) 然后真的去“采摘?”从结果对象中取出保留对象,然后将其返回。
  • JSON.parse(JSON.stringify... 很难提高性能。你不会在深拷贝实现中看到它。您可以对其进行深度复制并从中删除属性,也可以在手动复制数组时省略属性,并检查是否可以比现有解决方案(如 _、cloneDeep)更好地进行深度复制。你无法避免迭代,因为没有迭代就无法完成数组处理,

标签: javascript typescript immutability deep-copy


【解决方案1】:

你应该在你的数组上使用splice 方法,结合对象的克隆(即由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;
}

【讨论】:

  • 拼接是破坏性的,不是吗?
  • 破坏性是什么意思?它只是从数组中删除对象。这就是问题的情况,我猜;)
  • 问题是“我无法改变现有的房屋阵列。”
  • 好吧.. 给我一秒钟 :)
  • 现在好点了吗? :)
猜你喜欢
  • 2012-05-30
  • 1970-01-01
  • 2019-05-28
  • 1970-01-01
  • 2020-06-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多