我有一个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...
但是,如果它们的顺序不同样,则游戏...
相关问题:
JavaScript是否保证对象属性订单?(JavScript不能保证订单...除非您可以期望订单...(
ES6是否为对象属性引入了明确定义的枚举顺序?(有时保证的订单...但不是object.keys?(
是哪个?我应该使用什么来确保我的MySQL逃脱值与我的MySQL列名的顺序相同?
我会根据其他多个用户的建议使用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);
您可以将对象转换为单个循环中的数组。它将保证正确的顺序:
const fileObj = {filename: 'file1', filepath: '/file1/path/', flag: true,}
const vals = [], placeholder = [];
const keys = Object.keys(fileObj).map(k => vals.push(fileObj[k]) && placeholder.push('?') && k);
console.log(`INSERT INTO table1 (${keys}) VALUES (${placeholder})`);
console.log(keys + ''); console.log(vals + '');
如果使用MySQL2 NPM软件包,则可以使用此更好的语法。
const fileObj = {filename: 'file1', filepath: '/file1/path/', flag: true,}
const sql = `INSERT INTO table1 SET ?`;
const result = await connection.query(sql, [fileObj]);
我个人不使用对象的任何hackish操纵(最初应该是值得无序的钥匙映射值的设计(,因为它们可以定义(有时在同一解释器的版本(。
如果您想订单使用数组:
const fileObj = [
{
key: 'filename',
val: 'file1'
},
{
key: 'filepath',
val: '/file1/path/'
},
{
key: 'flag',
val: true,
}
];
这是明确的,可以在JS的所有版本和实现中使用。