【问题标题】:Remove and update an array without mutation in Javascript在Javascript中删除和更新没有突变的数组
【发布时间】:2021-01-20 04:18:56
【问题描述】:

我有一个数组:

let originalArr = ['apple', 'plum', 'berry'];

如何在不改变 originalArr 的情况下从此数组中删除“plum”?

我可以想到以下方法:

let copyArr = [...originalArr];
originalArr = copyArr.filter(item => {
     return item !== 'plum';
});

【问题讨论】:

  • filter 创建一个新数组,因此您的第二个 sn-p 中不需要 copyArr。
  • 更好的方法是什么意思?
  • 不确定我明白了。 我们有没有更好的方法来删除项目并更新 originalArr 变量。但我以为你问的是如何在不改变 originalArr 的情况下删除它...我错过了什么?
  • 对不起,我不应该提到最后一行..现在删除它
  • “没有变异”是什么意思? originalArr 应该维护'plum'条目并在没有它的情况下创建另一个数组?或者您需要在不修改数组引用的情况下删除李子。对于后一种情况,使用splice: originalArray.splice(originalArray.indexOf('plum'), 1)

标签: javascript typescript ecmascript-6


【解决方案1】:

您正在创建 两个 附加数组:一个 copyArr 和一个过滤数组。两者都不需要,只创建过滤后的数组应该可以正常工作,例如:

setOriginalArr(
  originalArr.filter(item => item !== 'plum')
);

例如,如果originalArr 处于状态。

在数组上调用 .filter 不会改变被调用的数组 - 它会返回一个新的、单独的数组,因此在 React 中使用是安全的,无需事先克隆原始数组。

【讨论】:

  • 谢谢..但此代码在角度服务中,originalArr 是服务变量。我想我也需要重新分配,对吗?如originalArr = originalArr.filter(item => item !== 'plum') ?
  • 你用 reactjs 标签标记了这个问题,所以我相信你的话。但即使在 React 之外,同样的事情也会起作用。如果您必须重新分配现有变量名称,那么是的,originalArr = originalArr.filter(item => item !== 'plum')
  • 太棒了..谢谢。只是标记为也做出反应,以便我可以从更广泛的社区获得评论:)
【解决方案2】:

您可以使用 slice() 方法从/到特定索引中提取项目(原始数组不发生突变)

let originalArr = ['apple', 'plum', 'berry'];
let sliced = originalArr.slice(1, 2)
console.log(originalArr, sliced)

【讨论】:

    猜你喜欢
    • 2020-05-30
    • 1970-01-01
    • 2016-08-08
    • 2020-10-11
    • 2020-07-07
    • 2023-01-09
    • 2020-04-11
    • 2014-09-17
    • 2018-10-20
    相关资源
    最近更新 更多