使用 obj 键减少,值未按预期工作
Reduce with obj key, value not working as expected
我正在尝试使用节点动态创建一个 sqlite 插入字符串。我有:
function update_json_obj_into_table(tablename, obj, search_condition) {
const insertValues = Object.entries(obj).reduce((acc, [k,v]) => acc.push(`${k} = ${v}`), []);
const insertValuesString = Array.prototype.join.call(insertValues, '/');
console.log(insertValuesString);
console.log(`UPDATE ${tablename} SET ${insertValues} WHERE ${search_condition}`);
// db.run(`UPDATE ${tablename} SET ${insertValuesString} WHERE search_condition ;`);
};
当我运行它时:
const obj = {Code: 'A1'};
update_json_obj_into_table('mytable', obj, 'search_condition')
我得到:
UPDATE mytable SET 1 WHERE search_condition.
显然 insertValues 没有正常工作。我期待:
代码=1
但结果显示为“1”。我做错了什么?
.push
returns 数组的新长度,而不是变异数组。虽然您可以将 .push
放在自己的行上,并将数组 return 放在下一行:
function update_json_obj_into_table(tablename, obj, search_condition) {
const insertValues = Object.entries(obj).reduce((acc, [k, v]) => {
acc.push(`${k} = ${v}`);
return acc;
}, []);
const insertValuesString = Array.prototype.join.call(insertValues, '/');
console.log(insertValuesString);
console.log(`UPDATE ${tablename} SET ${insertValues} WHERE ${search_condition}`);
// db.run(`UPDATE ${tablename} SET ${insertValuesString} WHERE search_condition ;`);
};
const obj = {
Code: 'A1'
};
update_json_obj_into_table('mytable', obj, 'search_condition')
使用 .map
会更有意义,因为输入数组和输出 insertValues
数组是一对一的:
function update_json_obj_into_table(tablename, obj, search_condition) {
const insertValues = Object.entries(obj)
.map(([k, v]) => `${k} = ${v}`);
const insertValuesString = Array.prototype.join.call(insertValues, '/');
console.log(insertValuesString);
console.log(`UPDATE ${tablename} SET ${insertValues} WHERE ${search_condition}`);
// db.run(`UPDATE ${tablename} SET ${insertValuesString} WHERE search_condition ;`);
};
const obj = {
Code: 'A1'
};
update_json_obj_into_table('mytable', obj, 'search_condition')
也就是说,像这样动态构建的查询很少是个好主意 - 除非输入值得信赖,否则它可能会危及您的数据库。即使输入是可信的,它也可能由于分隔符转义问题、保留作品等问题而不优雅。最好查看如何使用准备好的语句,以便 数据库驱动程序 处理外部值的插值。
我正在尝试使用节点动态创建一个 sqlite 插入字符串。我有:
function update_json_obj_into_table(tablename, obj, search_condition) {
const insertValues = Object.entries(obj).reduce((acc, [k,v]) => acc.push(`${k} = ${v}`), []);
const insertValuesString = Array.prototype.join.call(insertValues, '/');
console.log(insertValuesString);
console.log(`UPDATE ${tablename} SET ${insertValues} WHERE ${search_condition}`);
// db.run(`UPDATE ${tablename} SET ${insertValuesString} WHERE search_condition ;`);
};
当我运行它时:
const obj = {Code: 'A1'};
update_json_obj_into_table('mytable', obj, 'search_condition')
我得到:
UPDATE mytable SET 1 WHERE search_condition.
显然 insertValues 没有正常工作。我期待:
代码=1
但结果显示为“1”。我做错了什么?
.push
returns 数组的新长度,而不是变异数组。虽然您可以将 .push
放在自己的行上,并将数组 return 放在下一行:
function update_json_obj_into_table(tablename, obj, search_condition) {
const insertValues = Object.entries(obj).reduce((acc, [k, v]) => {
acc.push(`${k} = ${v}`);
return acc;
}, []);
const insertValuesString = Array.prototype.join.call(insertValues, '/');
console.log(insertValuesString);
console.log(`UPDATE ${tablename} SET ${insertValues} WHERE ${search_condition}`);
// db.run(`UPDATE ${tablename} SET ${insertValuesString} WHERE search_condition ;`);
};
const obj = {
Code: 'A1'
};
update_json_obj_into_table('mytable', obj, 'search_condition')
使用 .map
会更有意义,因为输入数组和输出 insertValues
数组是一对一的:
function update_json_obj_into_table(tablename, obj, search_condition) {
const insertValues = Object.entries(obj)
.map(([k, v]) => `${k} = ${v}`);
const insertValuesString = Array.prototype.join.call(insertValues, '/');
console.log(insertValuesString);
console.log(`UPDATE ${tablename} SET ${insertValues} WHERE ${search_condition}`);
// db.run(`UPDATE ${tablename} SET ${insertValuesString} WHERE search_condition ;`);
};
const obj = {
Code: 'A1'
};
update_json_obj_into_table('mytable', obj, 'search_condition')
也就是说,像这样动态构建的查询很少是个好主意 - 除非输入值得信赖,否则它可能会危及您的数据库。即使输入是可信的,它也可能由于分隔符转义问题、保留作品等问题而不优雅。最好查看如何使用准备好的语句,以便 数据库驱动程序 处理外部值的插值。