我有一个javascript(node.js)对象:
const fileObj = {filename: 'file1', filepath: '/file1/path/', flag: true,}
对于对象,我被告知无法保证顺序(与明确排序的数组不同) - 所以我可以确定
Object.values(fileObj)
将以与
键吐出的键相同的顺序吐出值Object.keys(fileObj)
这一点至关重要的原因是在节点中使用mysql转义值:
const mysql = require('mysql');
const connection = mysql.createConnection(credentials);
const fileObj = {filename: 'file1', filepath: '/file1/path/', flag: true,}
const cols = Object.keys(fileObj).join(', ');
const placeholder = Object.keys(fileObj).fill('?').join(', ');
const sql = `INSERT INTO table1 (${cols}) VALUES (${placeholder})`;
connection.query(sql, Object.values(fileObj), function (error, results, fields) {
// Do stuff
});
这会创建一个SQL语句:
sql = INSERT INTO table1 (filename, filepath, flag) VALUES (?, ?, ?);
然后在理论上将其与转义值结合起来:
connection.query(sql, ['file1', '/file1/path/', true], function...
但如果他们不是全部都在同一个顺序,游戏结束......
相关问题:
Does JavaScript Guarantee Object Property Order?(Javscript不保证订单......除非您可以预期订单......)
Does ES6 introduce a well-defined order of enumeration for object properties?(有时保证订单......但不能使用Object.keys吗?)
这是什么?我应该使用什么来确保我的mySQL转义值与mySQL列名称的顺序相同?
答案 0 :(得分:3)
我会根据多个其他用户的建议使用Object.entries
。
然后,您可以选择继续提取密钥和值,这次保证在SQL语句中使用该命令。
var attributes = {
a: 'A',
f: 'F',
c: 'C',
b: 'B',
e: 'E',
d: 'D',
};
const entries = Object.entries(attributes);
const keys = entries.map(entry => entry[0]);
const values = entries.map(entry => entry[1]);
console.log(keys, values);
答案 1 :(得分:2)
您可以在一个循环中将对象转换为数组。它将保证正确的订单:
const fileObj = {filename: 'file1', filepath: '/file1/path/', flag: true,}
const keys = [], vals = [], placeholder = [];
Object.keys(fileObj).map(k => keys.push(k) && vals.push(fileObj[k]) && placeholder.push('?'));
console.log(`INSERT INTO table1 (${keys}) VALUES (${placeholder})`);
console.log(keys + ''); console.log(vals + '');

答案 2 :(得分:1)
如果使用mysql2 npm软件包,则可以使用这种更好的语法。
const fileObj = {filename: 'file1', filepath: '/file1/path/', flag: true,}
const sql = `INSERT INTO table1 SET ?`;
const result = await connection.query(sql, [fileObj]);
答案 3 :(得分:0)
我个人不会使用对对象的任何hackish操作(其设计最初应该是无序的值键的映射),因为它们可以是实现定义的(有时在同一个解释器的版本之间有所不同)。 / p>
如果您想订购,请使用数组:
const fileObj = [
{
key: 'filename',
val: 'file1'
},
{
key: 'filepath',
val: '/file1/path/'
},
{
key: 'flag',
val: true,
}
];
这是明确的,适用于JS的所有版本和实现。