gpt4 book ai didi

javascript - JavaScript 中的不可变对象(immutable对象)和集合

转载 作者:行者123 更新时间:2023-11-30 15:30:51 27 4
gpt4 key购买 nike

我正在努力了解如何在 JavaScript/TypeScript 中使用不可变对象(immutable对象),而无需花一整天的时间。我还没有完全准备好深入研究 Immutable.js,因为就类型安全而言,它似乎让您高高在上。

让我们举个例子,我有一个数组,其中的元素都是 MyType 类型。在我的类中,我有一个方法可以搜索数组并返回匹配元素的副本,这样我们就不会编辑原始元素。现在说,稍后我需要查看对象是否在数组中,但我拥有的是副本,而不是原始对象。

处理这个问题的标准方法是什么?我能想到的任何确定我是否已经拥有该项目的方法都将采取某种形式循环遍历集合并访问每个元素,然后进行笨拙的相等匹配,无论是将它们都转换为字符串还是使用第三个 -派对图书馆。

我想使用 Immutables,但我总是遇到这样的情况,这让它们看起来很不吸引人。我错过了什么?

最佳答案

我怀疑我的解决方案不是“...处理此问题的标准方法”。但是,我认为这至少是一种方式来完成我认为您要问的事情。

您写道,您有一个方法“...返回匹配元素的副本,这样我们就不会编辑原始元素”。您能否更改该方法,使其返回两者 原始副本?

例如,下面的策略涉及从数组中检索原始元素(稍后可用于通过引用进行搜索)和克隆(可根据需要在不影响原始元素的情况下对其进行操作)。在检索过程中仍然存在克隆原始数据的成本,但至少在以后搜索数组时不必对数组中的每个元素都进行此类转换。此外,它甚至允许您区分值相同的数组元素,如果您最初只检索元素的副本,这是不可能的。下面的代码通过使每个数组元素按值相同(但是,根据对象的定义,按引用不同)来演示这一点。

我不知道这是否违反了其他不可变性最佳实践,例如,保留对元素的引用的副本(我想这会使代码对 future 违反不可变性的行为开放,即使它们目前没有被违反...... .虽然你可以 deep-freeze 原来的,以防止 future 的突变)。然而,它至少允许您在技术上保持一切不变,同时仍然能够通过引用进行搜索。因此,您可以随心所欲地改变您的克隆,但仍然始终保留原始文件的关联引用复制。

const retrieveDerivative = (array, elmtNum) => {
const orig = array[elmtNum];
const clone = JSON.parse(JSON.stringify(orig));
return {orig, clone};
};

const getIndexOfElmt = (array, derivativeOfElement) => {
return array.indexOf(derivativeOfElement.orig);
};


const obj1 = {a: {b: 1}}; // Object #s are irrelevant.
const obj3 = {a: {b: 1}}; // Note that all objects are identical
const obj5 = {a: {b: 1}}; // by value and thus can only be
const obj8 = {a: {b: 1}}; // differentiated by reference.

const myArr = [obj3, obj5, obj1, obj8];

const derivedFromSomeElmt = retrieveDerivative(myArr, 2);

const indexOfSomeElmt = getIndexOfElmt(myArr, derivedFromSomeElmt);

console.log(indexOfSomeElmt);

关于javascript - JavaScript 中的不可变对象(immutable对象)和集合,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42262283/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com