如何从Set获取基于索引的值

时间:2017-06-23 07:09:55

标签: javascript immutable.js

我希望存储一个唯一字符串列表(因此设置)并希望根据索引检索值。我使用 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"

5 个答案:

答案 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