我希望存储一个唯一字符串列表(因此设置)并希望根据索引检索值。我使用 get(index)但事实证明它返回未定义。所以我似乎不理解Set。
如果需要检索值,我们是否必须将其转换回数组,然后只读取它或使用“ get(index)”才能实现?
此外,我已检查Set tests以了解获取(索引),但仍然不清楚。
const { Set } = require('immutable');
const set = Set(["ab", "cd", "ef"])
console.log(set.get(1)) //logs undefined
console.log(set.toJS()[1]) //logs "cd"
答案 0 :(得分:2)
这里我试图在没有ImmutableJS
的情况下直接使用es2015中的Set:
您可以编写这样的自定义函数:
Set.prototype.getByIndex = function(index) { return [...this][index]; }
var set = new Set(['a', 'b', 'c'])
console.log(set.getByIndex(0)) // 'a'
请注意,spread运算符会将一个集转换为数组,以便您可以使用index来访问该元素
答案 1 :(得分:0)
另一种方法是使用Array.from(set)[0]
。
答案 2 :(得分:0)
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))
答案 3 :(得分:0)
使用Array.from()或spread需要在返回示例之前迭代整个集合。从性能角度来看,这是不理想的。
更好的解决方案是:
function getSetValueByIndex(target, index) {
if (typeof index !== 'number') throw new Error(`Index must be a number!`);
let i = 0;
for (const item of target) if (i++ === index) return item;
throw new Error(`Index ${index} out of bounds!`);
}
答案 4 :(得分:-1)
使用Immutable的获取方式是通过" key"不是通过索引
console.log(set.get("cd")) // logs cd, at index 1
如果你想从Set迭代器中获取一个元素,你必须扩展不可变的集合
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