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