我有这样的用户控制器输入(项目的长度和数量可能会改变):
str = "['honda', 'toyota', 'lexus']"
我想把它转换成数组,但我很难找到最好的方法。 eval()
正是我所需要的,但它不是很优雅,在这种情况下很危险,因为它是用户控制器输入。
另一种方式是:
str[1..-2].split(',').collect { |car| car.strip.tr("'", '') }
=> ["honda", "toyota", "lexus"]
但这也不是很优雅。任何更“红宝石”的建议?
答案 0 :(得分:2)
您可以使用正则表达式:
# match (in a non-greedy way) characters up to a comma or `]`
# capture each word as a group, and don't capture `,` or `]`
str.scan(/'(.+?)'(?:,|\])/).flatten
或JSON.parse
(但考虑到单引号实际上在技术上不允许使用JSON):
JSON.parse( str.tr("'", '"') )
JSON.parse
在性能方面可能比正则表达式有一点优势,但是如果你期望你的用户做单引号转义,那么tr
就会搞砸了。在这种情况下,我会坚持使用正则表达式。
答案 1 :(得分:0)
JSON.parse看起来更正确,但这是另一种选择:
function hashcode(obj) {
var hc = 0;
var chars = JSON.stringify(obj).replace(/\{|\"|\}|\:|,/g, '');
var len = chars.length;
for (var i = 0; i < len; i++) {
// Bump 7 to larger prime number to increase uniqueness
hc += (chars.charCodeAt(i) * 7);
}
return hc;
}