为什么 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 Set连get
都没有,只有has
方法。 Immutable 在 Set 上具有所有这些方法,因为它在所有集合类型上使用 Collection 接口。
并非所有这些方法都有意义。此外,文档中的描述有时可能会产生误导,因为它通常是从父方法派生的 class。
当您只需要检查您的列表是否包含一个对象时,集合很有用。另一方面,列表适用于需要有序集合并需要能够通过其索引获取对象的情况。
Immutable 的集合类型可以很容易地转换为其他集合类型。当您将 Set 与 List 合并时,您已经明白了这一点。请注意,allThingsSorted = things.union(moreThings)
会生成一个集合,因为您调用 union
的对象定义了类型。
如果您需要在 Set 上有索引,请使用 OrderedSet!您可以在其上调用 toIndexedSeq()
以获得可迭代列表,您可以在其中 get
by index
我开始使用 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 Set连get
都没有,只有has
方法。 Immutable 在 Set 上具有所有这些方法,因为它在所有集合类型上使用 Collection 接口。
并非所有这些方法都有意义。此外,文档中的描述有时可能会产生误导,因为它通常是从父方法派生的 class。
当您只需要检查您的列表是否包含一个对象时,集合很有用。另一方面,列表适用于需要有序集合并需要能够通过其索引获取对象的情况。
Immutable 的集合类型可以很容易地转换为其他集合类型。当您将 Set 与 List 合并时,您已经明白了这一点。请注意,allThingsSorted = things.union(moreThings)
会生成一个集合,因为您调用 union
的对象定义了类型。
如果您需要在 Set 上有索引,请使用 OrderedSet!您可以在其上调用 toIndexedSeq()
以获得可迭代列表,您可以在其中 get
by index