关联集合的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)我不确定是否有一种更直接、更有效、更被接受的方法。