繁体   English   中英

不变的JS映射或列表

[英]Immutable JS map or list

假设我们有一个普通的javascript对象数组

[
  {id : 1, name : "Hartford Whalers"}, 
  {id : 2, name : "Toronto Maple Leafs"}, 
  {id : 3, name : "New York Rangers"}
]

我们希望将其引入immutablejs。 将其放入地图或列表中是最自然的方法,我们将如何更新其中一个对象的属性? 说将“ Hartford Whalers”的名称更改为“ Carolina Hurricanes”。

您应该为此创建一个地图列表。 Immutable.js有一个函数Immutable.fromJS将递归转换JS数组来Immutable.List和JS对象Immutable.Map

var input = [
  {id : 1, name : "Hartford Whalers"}, 
  {id : 2, name : "Toronto Maple Leafs"}, 
  {id : 3, name : "New York Rangers"}
];

var list = Immutable.fromJS(input);

list.toString(); // => "List [ Map { "id": 1, "name": "Hartford Whalers" }, Map { "id": 2, "name": "Toronto Maple Leafs" }, Map { "id": 3, "name": "New York Rangers" } ]"

您可以使用.setIn设置第一项的名称:

var list2 = list.setIn([0, "name"], "Carolina Hurricanes");

list2.toString(); // => "List [ Map { "id": 1, "name": "Carolina Hurricanes" }, Map { "id": 2, "name": "Toronto Maple Leafs" }, Map { "id": 3, "name": "New York Rangers" } ]"

您可以将名称=“ Hartford Whalers”的任何项目的名称设置为“ Carolina Hurricanes”:

var list3 = list.map(function(item) {
  if(item.get("name") == "Hartford Whalers") {
    return item.set("name", "Carolina Hurricanes");
  } else {
    return item;
  }
});

list3.toString(); // => "List [ Map { "id": 1, "name": "Carolina Hurricanes" }, Map { "id": 2, "name": "Toronto Maple Leafs" }, Map { "id": 3, "name": "New York Rangers" } ]"

我不同意。

您为数组的每个元素提供的示例是一个具有{ id }属性的对象。 可以假设您将要通过其ID访问此数组的元素。 多数民众赞成在什么ID。

是的,本机结构是Maps List 虽然你想要的是一个MapMaps

为什么?

考虑一下检索{ id: 1928, "Some Team" }所需要做的事情。 您必须在列表中进行一个接一个的迭代,直到找到匹配的ID。

一种更有效的方法是创建地图,这样您就可以直接“采摘”您的对象,例如

const input = Immutable.fromJS({
  1: {id : 1, name : "Hartford Whalers"}, 
  2: {id : 2, name : "Toronto Maple Leafs"}, 
  3: {id : 3, name : "New York Rangers"},
  // ...
  1928: {id : 1928, name : "Some Team"},
});

然后访问它,您需要做的是:

const team = input.get('1928');

您需要进行初始转换,如果服务器端来自API(称为标准化),则需要进行该转换。 它还具有保存数据的好处。

这实际上是“地图”一词的来源

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM