javascript数组作为string列表(保留引号)
我有一个string的数组。 当使用.toString()输出时,引号不会被保留。 这使得使用“in”构buildmysql查询变得困难。 考虑以下:
SELECT * FROM Table WHERE column IN ('item1','item2','item3','item4') toString is returning: IN (item1,item2,item3,item4)
必须有一个简单的修复,我在这里俯瞰。
引号不会被保留,因为它们实际上并不是string值的一部分,只是在代码中指定string文字而已。
所以,不要使用toString()
。 相反,一个办法是这样的:
var arr = ['item1','item2','item3','item4']; var quotedAndCommaSeparated = "'" + arr.join("','") + "'"; // quotedAndCommaSeparated === "'item1','item2','item3','item4'"
Array.join()方法返回一个string,它是所有数组元素连接成一个string,每个项目之间有一个(可选的)分隔符。 因此,如果您指定包含引号和逗号的分隔符,则只需手动为第一个和最后一个项目(分别)添加开始和结束的引号。
( 请告诉我你没有使用客户端JavaScript来形成你的SQL。)
编辑:允许一个空数组,包含一个默认值的结果string,否则(如由missno指出)该string将是"''"
:
var newString = arr.length === 0 ? "" : "'" + arr.join("','") + "'"; // default for empty array here ---^^
(可能更适合使用if (arr.length===0)
来执行一些其他操作,而不是运行SELECT语句。)
简单的解决方法是自己添加引号
for(var i=0; i<items.length; i++){ items[i] = "'" + items[i] + "'"; } var list_with_quotes = items.join(",");
请注意,我完全忽略了SQL注入问题。
使用Array.map
用引号包装每个元素:
items.map(function(item) { return "'" + item + "'" }).join(',');
使用ES6function,代码变得更简单 – 箭头函数和模板string(在node.js 4.0和更高版本中实现):
items.map(i => `'${i}'`).join(',');
您也可以使用白名单来防止SQL注入:
const validItems = new Set(['item1', 'item2', 'item3', 'item4']); items .filter(i => validItems.has(i)) .map(i => `'${i}'`) .join(',')
存储报价:
var names = ["'item1'","'item1'","'item3'"]; alert('IN (' + names[1] + ')'); // IN ('item1')