【发布时间】:2018-07-19 17:23:51
【问题描述】:
我有一个 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 列名的顺序相同?
【问题讨论】:
-
使用
Object.entries() -
使用
Object.entries并映射两次! -
或者根据其他建议使用
Object.entries,并使用INSERT... SET...SQL 语法映射一次。 -
Object.entries(yourObject)不保证条目的顺序,但它确实保持键:值配对。 -
根据一些参与编写 ES 规范的人的说法,语言并不能保证顺序,因为最后所有的
if x was invoked as归结为一个根本没有指定顺序的内部方法跨度>
标签: javascript mysql node.js javascript-objects