【问题标题】:Javascript tokenised list to associative collectionJavascript标记化列表到关联集合
【发布时间】:2014-11-18 15:21:44
【问题描述】:

我有大量逗号分隔的标记,有点像这样:

let str = "Rock,Paper,Scissors"; // ... except much bigger.

我需要传递大量数据,检查参数是否在此列表中。我最初的想法是将这个集合转换为一个对象并搜索键 - 可能有更好的方法。我知道:

str.split(",");

会给我一个数组。

["Rock", "Paper", "Scissors"]

这在功能上等同于

{
    "0": "Rock",
    "1": "Paper",
    "2": "Scissors"
}

但这对我帮助不大。有没有办法简单地转换键和值来给我一个有用的键控集合?如:

{
    "Rock":     "0",
    "Paper":    "1",
    "Scissors": "2"
}

自然地,一个简单的循环就可以做到这一点——只是想知道是否有任何语言内置的方式来做到这一点。这甚至是在 Javascript 中处理此问题的最佳方法还是有更好/更有效的方法?

【问题讨论】:

    标签: javascript token associative-array


    【解决方案1】:

    逻辑上你想要的是一个set。 JavaScript 是 going to have a Set class soon,但目前它还没有在浏览器中广泛使用。

    但是,鉴于您的键是字符串,您可以将对象用作假集合:

    // populate set
    var o = {};
    o["Rock"] = true;
    // ...add others
    
    // test membership
    if (o["Rock"] != null)
      // is in set
    

    如果您能够定位支持Set 的浏览器,那么您可以使用:

    var set = new Set(str.split(","));
    
    if (set.has("Rock"))
      // is in set
    

    这适用于当前的 Chrome 和 Firefox 版本。

    【讨论】:

      【解决方案2】:

      不,我认为没有任何“内置”方式可以做到这一点。但我认为完成你想要的最优雅的方法是:

      result = str.split(',').reduce(
        function(prev, cur, index) {
          prev[cur] = String(index); 
          return prev;
        }, {});
      

      【讨论】:

        【解决方案3】:

        是的,一个简单的for 循环是最好的方法:

        var str ="Rock,Paper,Scissors",
            arr = str.split(","),
            obj = {};
        
        for (var i = 0; i < arr.length; i++)
            obj[arr[i]] = i;
        

        结果:

        console.log(obj);
        -> Object {Rock: 0, Paper: 1, Scissors: 2}
        

        这里我们的for 循环只占用了两行代码。真的没有太多需要进一步简化这一点。如果您真的想要,您可以编写自己的函数来执行此操作。

        function arrayToObjectWithValuesAsKeys(array) {
            var obj = {};
        
            for (var i = 0; i < arr.length; i++)
                obj[arr[i]] = i;
        
            return obj;
        }
        
        var obj = arrayToObjectWithValuesAsKeys(str.split(","));
        

        【讨论】:

        • 我猜这就是为什么他在问题的结尾写了“自然地一个简单的循环就可以做到”......
        • @EasyPush 我在答案中添加了一些内容。
        • 谢谢。我已经用var my_coll = {}; str.split( "," ).forEach(function(name){my_coll[name]=true;}); 进行了尝试,这似乎可以完成这项工作。虽然 (a) 我对 forEach 有点不安,并且 (b) 我不确定是否有更直接、有效和可接受的方式来做到这一点。
        【解决方案4】:

        ES5 具有 map/reduce 方法,您可以处理每个数据集转换需求。

        function parse(str) {
            var arr = str.split(",");
            var obj = arr.reduce(function(prev, cur, index) {
                prev[cur] = index; 
                return prev;
            }, {});
            return obj;
        }
        
        var str = "Rock,Paper,Scissors"; // ... except much bigger.
        console.log(parse(str));
        

        小提琴:http://jsfiddle.net/gq0jc8hc/

        【讨论】:

          猜你喜欢
          • 2015-03-02
          • 2012-04-05
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2014-09-04
          • 2021-02-03
          • 1970-01-01
          相关资源
          最近更新 更多