我开始使用immutable.js,并且不明白为什么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"}相等。我应该怎么做才能得到预期的结果,而不是转换成列表呢?
发布于 2019-07-02 06:18:48
一张清单就像一个书架,你把书放在另一个书架上。每本书都是按(有时是随机的)顺序排列的,可以通过其位置(索引)来引用。你可以说“我想从左边读第二本书”。
另一方面,一套书是一个装满各种书籍的盒子。这是一种混乱的存储,书中没有位置/索引(!)。您可以选中包含特定书籍的方框,但不能说明书的确切位置。一本书的关键在于书本身!只有当你已经引用了这本书时,你才能调用它的get,使这个方法变得完全无用。
这个概念对于一般的集合是有效的,而不仅仅是不变的。JavaScript本机集甚至没有get,它只有一个has方法。不可变集上有所有这些方法,因为它在所有集合类型上都使用了Collection接口。并不是所有这些方法都有意义。此外,文档中的描述有时可能会产生误导,因为它通常是从父类派生出来的。
当您只需要检查您的列表是否包含一个对象时,集合是非常有用的。另一方面,列表是用于当您需要一个有序的集合,并且需要能够通过它的索引获得一个对象。不可变的集合类型可以很容易地转换为其他集合类型。当您将一组集合与一个列表合并时,您已经知道了这一点。注意,allThingsSorted = things.union(moreThings)会产生一个集合,因为调用union的对象定义了类型。
如果需要一组索引,请使用OrderedSet!您可以在上面调用toIndexedSeq()以获得一个可迭代列表,在该列表中可以按索引进行get
发布于 2019-06-28 13:59:42
List.get get是一个元素,其索引位于列表中,因此.get(1)返回第二个元素(排序后带有id:6的元素)。
Set.get将通过其id获得一个元素,因此.get(1)将查找一个id:1的元素,但它找不到
https://stackoverflow.com/questions/56808231
复制相似问题