用于`set('pdf ppt tif tiff jpg jpeg'.split())`的JavaScript?

时间:2012-05-14 00:13:00

标签: javascript set bookmarklet

主题行中的Python习语

set('pdf ppt tif tiff jpg jpeg'.split())

说明了创建一组字符串的相当紧凑的方法。 1 我正在寻找一个类似的 compact 成语来创建 set < JavaScript中的/ em> 。 (注意:我 只对创建字符串列表感兴趣。)

我理解JS中设置的标准方法是使用对象(键是设置元素,值是无关紧要的),但我还没有找到一种比较简洁的方法来在JS中创建这样的集合。

FWIW,我正在寻找的习语是用于书签(因此强调简洁)。

谢谢!

1 对于那些不熟悉Python的人,内部表达式只是计算通过在空白处拆分调用字符串对象而获得的字符串列表;这个列表就是set构造函数的参数。

编辑:强调我正在寻找 (即 对象 ),而不是列表字符串。

2 个答案:

答案 0 :(得分:5)

JavaScript没有set类型,但您需要一个辅助函数来轻松地从字符串(或Array)创建它。

这是一个辅助函数,它允许你在字符串上调用.set()并获取一个对象,将字符串中的项映射到某个值(true,如果没有指定):

String.prototype.set = function(val) {
    var items = this.split(' '),
        len = items.length,
        obj = {},
        i;
    for(i = 0; i < len; i++) {
        obj[items[i]] = val === undefined ? true : val;
    }
    return obj;
};

演示:

> 'pdf ppt tif tiff jpg jpeg'.set()
{ pdf: true,
  ppt: true,
  tif: true,
  tiff: true,
  jpg: true,
  jpeg: true }

由于您更喜欢简洁的东西,如果您只需要一个字符串,这可能是一个解决方案:

var set = (function(s){ var obj = {}; for(var i = 0, elems = s.split(' '), l = elems.length; i < l; i++) obj[elems[i]] = 1; return obj; })('pdf ppt tif tiff jpg jpeg');

在这种情况下,我会考虑简单地使用对象文字......除非你有大量元素,否则最有可能是最短的解决方案。

答案 1 :(得分:1)

ECMAScript第5版有Array.reduce

'pdf ppt tif tiff jpg jpeg'.split(' ').reduce(function(d,v){
    return d[v] = true,d
}, {});

Object
jpeg: true
jpg: true
pdf: true
ppt: true
tif: true
tiff: true
__proto__: Object