Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/450.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
关联集合的Javascript标记化列表_Javascript_Token_Associative Array - Fatal编程技术网

关联集合的Javascript标记化列表

关联集合的Javascript标记化列表,javascript,token,associative-array,Javascript,Token,Associative Array,我收集了大量逗号分隔的标记,有点像这样: let str = "Rock,Paper,Scissors"; // ... except much bigger. 我需要传递一大组数据,检查参数是否在此列表中。我最初的想法是将这个集合转换成一个对象,然后按键搜索——可能有更好的方法。我知道: str.split(","); 将给我一个数组 ["Rock", "Paper", "Scissors"] 我猜这在功能上相当于 { "0": "Rock", "1": "Paper",

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

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中处理此问题的最佳方法还是有更好/更有效的方法?

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

var str ="Rock,Paper,Scissors",
    arr = str.split(","),
    obj = {};

for (var i = 0; i < arr.length; i++)
    obj[arr[i]] = i;
这里我们的
for
循环只占用了区区2行代码。其实没有太多必要进一步简化。如果您真的想要,您可以编写自己的函数来实现这一点

function arrayToObjectWithValuesAsKeys(array) {
    var obj = {};

    for (var i = 0; i < arr.length; i++)
        obj[arr[i]] = i;

    return obj;
}

var obj = arrayToObjectWithValuesAsKeys(str.split(","));
函数ArrayToObjectWithValuesKey(数组){
var obj={};
对于(变量i=0;i
是的,一个简单的
for
循环是最好的方法:

var str ="Rock,Paper,Scissors",
    arr = str.split(","),
    obj = {};

for (var i = 0; i < arr.length; i++)
    obj[arr[i]] = i;
这里我们的
for
循环只占用了区区2行代码。其实没有太多必要进一步简化。如果您真的想要,您可以编写自己的函数来实现这一点

function arrayToObjectWithValuesAsKeys(array) {
    var obj = {};

    for (var i = 0; i < arr.length; i++)
        obj[arr[i]] = i;

    return obj;
}

var obj = arrayToObjectWithValuesAsKeys(str.split(","));
函数ArrayToObjectWithValuesKey(数组){
var obj={};
对于(变量i=0;i
从逻辑上讲,您需要的是一个集合。JavaScript是,但目前它在浏览器中并不广泛可用

但是,如果关键帧是字符串,则可以将对象用作伪集:

// 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版本。

从逻辑上讲,您需要的是一个集合。JavaScript是,但目前它在浏览器中并不广泛可用

但是,如果关键帧是字符串,则可以将对象用作伪集:

// 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版本中都有效。

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

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

不,我不认为有任何“内置”的方式来做到这一点。但我认为实现你想要的最优雅的方式是:

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

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

fiddle:

ES5有映射/减少方法,您可以处理每个数据集转换需要

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

fiddle:

我想这就是为什么他在问题的结尾写了“自然一个简单的循环就可以了…”@EasyPush我在答案上加了一点。谢谢。我已经用
var my_coll={}试过了;str.split(“,”).forEach(函数(名称){my_coll[name]=true;})似乎可以完成任务。虽然(a)我对forEach有点不安,(b)我不确定是否有一种更直接、更有效、更被接受的方法。我想这就是为什么他在问题的结尾写了“自然一个简单的循环就可以了…”EasyPush我在答案上加了一点。谢谢。我已经用
var my_coll={}试过了;str.split(“,”).forEach(函数(名称){my_coll[name]=true;})似乎可以完成任务。虽然(a)我对forEach有点不安,(b)我不确定是否有一种更直接、更有效、更被接受的方法。