javascript数组作为字符串列表(保留引号)

时间:2011-12-13 01:13:57

标签: javascript arrays node.js

我有一个字符串数组。当我使用.toString()输出它时,引号不会被保留。这使得使用“in”构建mysql查询变得很困难。请考虑以下事项:

SELECT * FROM Table WHERE column IN ('item1','item2','item3','item4')

toString is returning: IN (item1,item2,item3,item4)

我必须在这里找到一个简单的解决方法。

5 个答案:

答案 0 :(得分:63)

引号不会被保留,因为它们实际上并不是字符串值的一部分,它们只是在代码中指示字符串文字所必需的。

所以,不要使用toString()。相反,一种方法如下:

var arr = ['item1','item2','item3','item4'];

var quotedAndCommaSeparated = "'" + arr.join("','") + "'";

// quotedAndCommaSeparated === "'item1','item2','item3','item4'"

Array.join()方法返回一个字符串,该字符串是连接成单个字符串的所有数组元素,每个项目之间有一个(可选)分隔符。因此,如果您指定包含引号和逗号的分隔符,则只需手动为第一个和最后一个项目(分别)附加起始和结束报价。

告诉我你没有使用客户端JavaScript来构建你的SQL。)

编辑:要允许空数组,请为结果字符串包含默认值,否则(由missingno指出)字符串将为"''"

var newString = arr.length === 0 ? "" : "'" + arr.join("','") + "'";
// default for empty array here ---^^

(可能更适合让if (arr.length===0)采取其他行动而不是运行SELECT语句。)

答案 1 :(得分:5)

简单的解决方法是自己添加引号

for(var i=0; i<items.length; i++){
    items[i] = "'" + items[i] + "'";
}

var list_with_quotes = items.join(",");

请注意,我完全忽略了SQL注入问题。

答案 2 :(得分:1)

使用Array.map用引号包装每个元素:

items.map(function(item) { return "'" + item + "'" }).join(',');

使用ES6功能使代码变得更简单 - 箭头函数和模板字符串(在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(',')

答案 3 :(得分:0)

let keys = ['key1','key2']
let keyWithQoutes = keys.map((it) => {return `'${it}'`})
let sql = `SELECT .... FROM ... WHERE id IN (${keyWithQoutes})`
console.log(sql)

输出:“ SELECT .... FROM ... WHERE ID IN('key1','key2')”

答案 4 :(得分:-2)

存储引号:

var names = ["'item1'","'item1'","'item3'"];
alert('IN (' + names[1] + ')'); // IN ('item1')