Javascript 如何从集合中获取基于索引的值

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)) /

我希望存储一个唯一字符串列表(因此设置),并希望根据索引检索值。我使用了get(index),但结果它返回未定义的。所以我似乎不太了解布景

如果需要检索值,我们是否必须将其转换回数组,然后仅读取它,或者使用“get(index)”来实现它

此外,我已经检查了以了解get(index),但仍然不清楚

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.js
Set
,您需要自己澄清——它们是不同的。首先,前者没有
get
。Immutable.js为所有集合提供了
get
,但对于集合,它只返回项目本身:
new Immutable.Set().add(“foo”).get(“foo”)
返回
“foo”
(和
new Immutable.Set().add(“foo”).get(“bar”)
返回
未定义的
)。集合本质上是无序的,“集合索引”毫无意义。如果你想要索引,你需要一个数组(或者至少
不可变的.IndexedSeq
)。@Amadan感谢你的输入,集合的项没有严格的顺序,让我使用List(),看起来很有希望。似乎我只是触及了不可变的表面:)修改不属于自己的对象是不好的做法;这种模式已经造成了一些问题。这是关于这件事的另一篇好文章。当您修改不属于自己的对象时,它确实会降低代码的可维护性。