javascript - 更改不可变映射中的键

标签 javascript immutable.js

动态更改不可变映射中的键的最佳方法是什么?

// I have a map like this:
const names = Map({
  rya: true,
  mike: false,
});

// I receive this as inputs
const inputIndex = 0;
const inputLetter = n;

// What are the operations that i need to do here to get the expected output
// [?CODE?]

// I expect this as output:
const names = Map({
  ryan: true,
  mike: false,
});

到目前为止,我的解决方案似乎效率很低:

const namesEntrySeq = names.entrySeq();

const objectToModify = namesEntrySeq.get(inputIndex);

objectToModify[0] = objectToModify[0] + inputLetter;

const namesAsArray = namesEntrySeq.toArray();

namesAsArray[inputIndex] = objectToModify;

const names = Immutable.Map(namesAsArray);

必须有更优雅的方式吗?

最佳答案

如果您依赖于 map 中实体的顺序保持不变,则应该使用 OrderedMap ,或者像Rafael said那样做并自己跟踪订单。 如果您使用 OrderedMap,则可以使用 #mapEntries更新其中的 key :

const names = Immutable.Map({
  rya: true,
  mike: false,
});
const letterToAdd = 'n';
const indexToUpdate = 0;

const updatedNames = names.mapEntries(([key, value], index) => {
  if (index === indexToUpdate) {
    return [key + letterToAdd, value];
  } else {
    return [key, value];
  }
});

console.log(updatedNames);
<script src="https://cdnjs.cloudflare.com/ajax/libs/immutable/4.0.0-rc.9/immutable.js"></script>

请注意,这是低效的,因为它将迭代映射中的每个条目以更改条目。如果您的 map 很小,这可能并不重要。

<小时/>

顺便说一句,您存储此数据的方式似乎不利于您想要修改它的方式。我会考虑重组您的数据,以便更轻松地对其执行您想要的操作类型。

关于javascript - 更改不可变映射中的键,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48846392/

相关文章:

immutable.js - 如何用 Flow 描述 Immutable.js map 形状

typescript - 如何使用 Typescript 正确地将 Immutable Map 转换为严格类型

reactjs - 优化更新 redux 状态

javascript - 不可变js : One liner code to convert keys of a map into array?

javascript - 对象数组的操作

javascript - Immutable Js - 使用不可变 js 更新深层嵌套树

javascript - 使用 Webpack 设置纯 HTML/CSS 组件元素

javascript - 尾随逗号会破坏 JSON 吗?

javascript - 无法绑定(bind)点击事件

javascript - Facebook 登录按钮重定向到 MS Edge 上的空白页面