为什么 immutable.Set.get(x) 不像 immutable.List.get(x) 那样工作?

Why immutable.Set.get(x) doesn't work as immutable.List.get(x)?

我开始使用 immutable.js 并且不明白为什么 Sets 的 get 方法与 Lists 的 get 方法显示的结果不同

import { fromJS, List, Map, Set } from 'immutable';

const things = fromJS(
  [
    {
      id: 9,
      nome: 'nove'
    },
    {
      id: 7,
      nome: 'sete'
    },
    {
      id: 8,
      nome: 'oito'
    },
    {
      id: 8,
      nome: 'oito'
    }
  ]
).toSet();

const moreThings = fromJS(
  [
    {
      id: 9,
      nome: 'nove'
    },
    {
      id: 6,
      nome: 'seis'
    }
  ]
).toSet();

const anotherThing = Map(
  {
    id: 4,
    nome: 'quatro'
  }
);

const allThingsSorted = things
    .union(moreThings)
    .add(anotherThing)
    .sortBy(thing => thing.get('id'));

console.log(allThingsSorted); // [Object, Object, Object, Object, Object]
console.log(allThingsSorted.get(1)); // undefined
console.log(allThingsSorted.toList().get(1)); // {id: 6, nome: "seis"}


我预计第二个日志 undefined 等于第三个日志 {id: 6, nome: "seis"}。 我应该怎么做才能获得预期的结果,而不是转换为列表?

List.get 通过其在列表中的索引获取一个元素,因此 .get(1) returns 第二个元素(排序后带有 id:6 的元素)。

Set.get 将通过其 id 获取一个元素,因此 .get(1) 查找具有 id:1 的元素,但它找不到

列表就像一个架子,你可以把书放在一起。每本书都按(有时是随机的)排序顺序排列,可以通过其位置(索引)进行引用。 你可以说 "I want to read the 2nd book from the left".

另一方面,一套是装满各种书籍的盒子。它是一个混乱的存储空间,书籍没有 position/index (!)。您可以选中包含特定书籍的复选框,但不能说明该书的确切位置。 Set 中一本书的关键是这本书本身!只有当您已经引用了这本书时,您才能对其调用 get,从而使该方法完全无用。

这个概念对 Set 一般有效,而不仅仅是不可变的。 JavaScript native Setget都没有,只有has方法。 Immutable 在 Set 上具有所有这些方法,因为它在所有集合类型上使用 Collection 接口。 并非所有这些方法都有意义。此外,文档中的描述有时可能会产生误导,因为它通常是从父方法派生的 class。

当您只需要检查您的列表是否包含一个对象时,集合很有用。另一方面,列表适用于需要有序集合并需要能够通过其索引获取对象的情况。 Immutable 的集合类型可以很容易地转换为其他集合类型。当您将 Set 与 List 合并时,您已经明白了这一点。请注意,allThingsSorted = things.union(moreThings) 会生成一个集合,因为您调用 union 的对象定义了类型。

如果您需要在 Set 上有索引,请使用 OrderedSet!您可以在其上调用 toIndexedSeq() 以获得可迭代列表,您可以在其中 get by index