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

Ant*_*ebb 25 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)
Run Code Online (Sandbox Code Playgroud)

必须有一个我在这里忽略的简单修复.

nnn*_*nnn 66

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

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

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

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

// quotedAndCommaSeparated === "'item1','item2','item3','item4'"
Run Code Online (Sandbox Code Playgroud)

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

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

编辑:允许一个空数组,包括结果字符串的默认值,否则(由missingno指出)字符串将是"''":

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

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


Luk*_*tor 11

用于Array.map用引号包裹每个元素:

items.map(function(item) { return "'" + item + "'" }).join(',');
Run Code Online (Sandbox Code Playgroud)

ES6 特性让代码变得更简单——箭头函数和模板字符串(在 node.js 4.0 及更高版本中实现):

items.map(i => `'${i}'`).join(',');
Run Code Online (Sandbox Code Playgroud)

您还可以使用白名单来防止 SQL 注入:

const validItems = new Set(['item1', 'item2', 'item3', 'item4']);

items
   .filter(i => validItems.has(i))
   .map(i => `'${i}'`)
   .join(',')
Run Code Online (Sandbox Code Playgroud)


小智 7

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

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


hug*_*omg 5

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

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

var list_with_quotes = items.join(",");
Run Code Online (Sandbox Code Playgroud)

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