Javascript 如何从集合中获取基于索引的值
我希望存储一个唯一字符串列表(因此设置),并希望根据索引检索值。我使用了get(index),但结果它返回未定义的。所以我似乎不太了解布景 如果需要检索值,我们是否必须将其转换回数组,然后仅读取它,或者使用“get(index)”来实现它 此外,我已经检查了以了解get(index),但仍然不清楚Javascript 如何从集合中获取基于索引的值,javascript,immutable.js,Javascript,Immutable.js,我希望存储一个唯一字符串列表(因此设置),并希望根据索引检索值。我使用了get(index),但结果它返回未定义的。所以我似乎不太了解布景 如果需要检索值,我们是否必须将其转换回数组,然后仅读取它,或者使用“get(index)”来实现它 此外,我已经检查了以了解get(index),但仍然不清楚 const { Set } = require('immutable'); const set = Set(["ab", "cd", "ef"]) console.log(set.get(1)) /
const { Set } = require('immutable');
const set = Set(["ab", "cd", "ef"])
console.log(set.get(1)) //logs undefined
console.log(set.toJS()[1]) //logs "cd"
在这里,我尝试直接使用es2015中的集合,而不使用
ImmutableJS
:
您可以编写如下自定义函数:
Set.prototype.getByIndex=function(index){return[…this][index];}
变量集=新集(['a','b','c'])
console.log(set.getByIndex(0))//a'
使用Immutable的get的方法是按“键”而不是按索引
console.log(set.get("cd")) // logs cd, at index 1
如果要从集合的迭代器中获取元素,必须扩展Immutable的集合
Set.prototype.getByIdx = function(idx){
if(typeof idx !== 'number') throw new TypeError(`Argument idx must be a Number. Got [${idx}]`);
let i = 0;
for( let iter = this.keys(), curs = iter.next(); !curs.done; curs = iter.next(), i++ )
if(idx === i) return curs.value;
throw new RangeError(`Index [${idx}] is out of range [0-${i-1}]`);
}
const set = Set(["ab", "cd", "ef"]);
console.log(set.getByIdx(1)) //logs cd
另一种方法是使用
Array.from(set)[0]
使用Array.from()或spread需要在返回示例之前迭代整个集合。从性能角度来看,这并不理想
let data = new Set();
data.add('Value 1');
data.add('Value 2');
data.add('Value 3');
function getSetValueByIndex(setObj, index) {
return [...setObj][index]
}
console.log(getSetValueByIndex(data, 1))
更好的解决办法是:
函数getSetValueByIndex(目标,索引){
if(typeof index!=='number')抛出新错误('index必须是数字!`);
设i=0;
如果(i++==索引)返回项,则用于(目标的常量项);
抛出新错误(`Index${Index}超出范围!`);
}
首先,如果您使用的是ES6
Set
,或者Immutable.jsSet
,您需要自己澄清——它们是不同的。首先,前者没有get
。Immutable.js为所有集合提供了get
,但对于集合,它只返回项目本身:new Immutable.Set().add(“foo”).get(“foo”)
返回“foo”
(和new Immutable.Set().add(“foo”).get(“bar”)
返回未定义的)。集合本质上是无序的,“集合索引”毫无意义。如果你想要索引,你需要一个数组(或者至少不可变的.IndexedSeq
)。@Amadan感谢你的输入,集合的项没有严格的顺序,让我使用List(),看起来很有希望。似乎我只是触及了不可变的表面:)修改不属于自己的对象是不好的做法;这种模式已经造成了一些问题。这是关于这件事的另一篇好文章。当您修改不属于自己的对象时,它确实会降低代码的可维护性。