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

时间:2019-06-28 13:52:18

标签: immutable.js

我开始使用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?

2 个答案:

答案 0 :(得分:2)

Select T.version_col, IF(@o = T.version_col, @i, @i := @i+1) as group_id, -- Increase the group_id by +1 if the old version_col <> new version_col @o := T.version_col -- [re]-initialise or take note of version_col FROM myTable T join (select @i := -1) I -- here initialise your counter ORDER BY T.version_col desc 通过列表中的索引获取一个元素,因此List.get返回第二个元素(排序后为id:6的元素)。

.get(1)将通过其ID获得元素,因此Set.get会找到ID:1找不到的元素

答案 1 :(得分:1)

列表就像书架,您可以在书架之间放置书本。每本书按(有时是随机的)排序顺序,并且可以通过其位置(索引)进行引用。 您可以说“我想从左边看第二本书”。

另一方面,一箱是装满各种书籍的盒子。它是一个混乱的存储,其中书籍没有位置/索引(!)。您可以选中包含特定书籍的框,但不要说出确切的位置。 套装中一本书的关键是书本身!仅当您已经参考了该书时,您才能在其上调用get,从而使该方法完全无用。

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

当您只需要检查列表中是否包含对象时,设置很有用。另一方面,列表用于需要有序集合并且需要能够通过其索引获取对象的对象。 不可变的集合类型可以轻松转换为其他集合类型。当您将Set与List合并时,您已经弄清楚了。请注意,allThingsSorted = things.union(moreThings)会产生一个Set,因为调用union的对象定义了类型。

如果需要在集合上具有索引,请使用OrderedSet!您可以在其上调用toIndexedSeq()以获得可迭代的列表,在此处可以按索引get