Javascript Object Paranoia(我可以依赖于元素的顺序)

时间:2018-02-09 01:23:37

标签: javascript mysql node.js javascript-objects

我有一个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列名称的顺序相同?

4 个答案:

答案 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的所有版本和实现。