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